2

K&R书中有一个问题如下:

编写一个程序,将大写转换为小写,反之亦然,具体取决于调用它的名称?

在给出的解决方案中,它说当使用 name 调用程序时lower,程序转换lowerupper. 在解决方案argv[0]中是比较的,"lower"但在 Linux 上argv[0]会是"./lower"而不是"lower"

有人可以澄清一下吗?

4

2 回答 2

3

考虑这个测试代码:

#include <stdio.h>
int main(int argc, char** argv) {
  printf("ARGV[0] = %s\n", argv[0]);
}

如果我将它编译为“test_argv”并运行它,我会得到我输入的任何内容来运行程序:

% ./test_argv
ARGV[0] = ./test_argv
% test_argv
ARGV[0] = test_argv
% /tmp/test_argv
ARGV[0] = /tmp/test_argv

因此,您想要测试字符串,例如,针对正则表达式或子字符串。

于 2012-07-03T17:23:14.700 回答
3

Shell 如何执行你的程序?(下面很简单的解释)

shell()
{
  loader("Path name/Filename of your program", argv[0], argv[1]...for your program);
}

这意味着加载器的所有这些参数都是由 shell 生成的,然后加载器被调用,默认情况下 argv[0] 与程序的路径名/文件名相同。

现在什么时候说./a.out ..它意味着你的程序的绝对路径名是./a.out。(当前目录中的文件a.out)

我们可以省略./吗?答案是肯定的,如果环境变量 PATH 具有 . 作为它的一个组成部分说第一个组成部分。

您可以通过在 shell 提示符中键入 echo $PATH 来查看 PATH 变量的内容。(将看到分隔的路径列表)。

如果 。不在那里,您可以通过在 shell 提示符下键入 export PATH=.:$PATH 来添加它。

在此之后,您可以通过键入 a.out 从当前目录运行您的代码,而不必键入 ./a.out。

现在我认为这很清楚为什么 argv[0] 成为您正在执行的文件的名称?

现在我们可以为 argv[0] 设置一个不同的名称而不是文件名吗?

答案是肯定的,然后您需要自己调用加载程序,即编写一小段行为类似于 shell 的代码。

您可以浏览互联网/手册页以获取execve系列函数,这实际上是这里提到的加载程序。

于 2012-07-03T18:27:34.977 回答