是否可以根据 argv[0] 编写功能不同的 C 程序?

Is it possible to write a C program that functions differently according to argv[0]?

是否可以根据 argv[0] 编写功能不同的 C 程序?

事实上,我正在做 C 教科书中的练习。练习是编写一个程序,将大写字母转换为小写字母或将小写字母转换为大写字母,具体取决于调用它的名称,如 argv[0].

中所示

[编辑] 仅供参考,练习来自 K&R 的教科书

Is it possible to write a C program that functions differently according to argv[0]?

是的,这是可能的,非常简单。例如:

if (0 == strcmp(argv[0], "say_hello")) {
    printf("hello\n");
} else if (0 == strcmp(argv[0], "say_bye")) {
    printf("bye\n");
}

嗯,你可以简单地根据程序名称选择使用什么功能

#include <string.h>
#include <ctype.h>

int     main(int ac, char **av)
{
    if (strcmp(av[0], "upper") == 0)
        do something;
    else if (strcmp(av[0] "lower") == 0)
        do something;
    return (0);
}

是的,绝对有可能。为了在本练习中正确管理 char 值,我建议使用 ASCII 表,您可以查看 here

想法是: 我们知道大写字母从十进制值 65 开始,到值 90 结束。 小写字母从 97 开始到值 122 结束。

现在,如果我们有,例如,十进制值为 68 的字母 D,为了使其变为小写,我们只需添加 32,就变成 68 + 32 = 100,即小写字母 'd'.

的精确值

如果我们有小写字母j,类似的事情是106。我们减去32得到74,这就是大写字母'J的精确值。

这两个函数使用前面的方法分别将小写字母转换为大写字母,反之亦然。

void toLower(char *string){
    //For any letter in *string
    for(int i = 0; i < strlen(string); i++){
      //If letter at index I is really uppercase
      if(string[i] >= 65 && string[i] <= 90)
        //it becomes lowercase by adding 32 to its ASCII value
        string[i] += 32;
    }
}

void toUpper(char *string){
  //For any letter in *string
  for(int i = 0; i < strlen(string); i++)
    //If letter at index I is really Lowercase
    if(string[i] >= 97 && string[i] <= 122)
      //it becomes Uppercase by adding 32 to its ASCII value
      string[i] -= 32;
}

现在的主要功能:

int main(int argc, char *argv[]){
  //Taking program name from argv[0]
  char *upperOrLower = argv[0];
  //Adding 2 to Program Name in order to remove characters '.' and '/' from String
  upperOrLower += 2;
  //Retrieving String given as argument
  char *string = argv[1];
  //If Program Name is lower
    if(strcmp(upperOrLower, "lower") == 0){
      //We have Uppercase string, so we use toLower function
      printf("String before calling toLower: %s\n", argv[1]);
      toLower(string);
      printf("String after calling toLower: %s\n", string);
    }
    //Else if we have upper as program name
    else if(strcmp(upperOrLower, "upper") == 0){
      //We have Lowercase string, so we use toUpper function
      printf("String before calling toUpper: %s\n", string);
      toUpper(string);
      printf("String after calling toUpper: %s\n", string);
    }
}

现在将上面的程序编译为:

gcc program.c -o upper

并通过键入以下命令执行它:

./upper hello

输出应该是:

String before calling toUpper: hello
String after calling toUpper: HELLO

反过来,如果我们通过键入编译它:

gcc program.c -o lower

然后我们通过键入以下内容来执行它:./lower HELLO 我们应该得到输出:

String before calling toLower: HELLO
String after calling toLower: hello

您可能想要添加对 argc 值的检查,它会告诉我们您为程序提供了多少参数,否则如果参数不足,您可能会出错。

这应该是您的练习所要求的全部内容。

希望我已经说清楚了。