所以,我正在研究基于Linux的命令行实用程序,它必须接受一些标志,我注意到了一些有趣的行为。我将发布我在主实用程序之外使用的测试代码。我正在使用这段代码,所以在我可以插入工作代码之前,我不必改变实际的实用程序。所以这是我一直在摆弄的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
while(--argc && (*++argv)[0] == '-')
putchar('*');
printf("\n%s\n", argv[0]);
}
请忽略这样一个事实:所有这个程序都打印星号,并在使用一个参数-b调用时打印自己的名称。打印星号只是为了表明循环运行一次。所以,我在终端中以“./test -n”运行它,我期望输出为:
*。/测试
令我惊讶的是,输出结果是:
* - B
我有一个关于声明的工作理论
(*++argv)[0]
正在做,但我仍然有点朦胧。我的假设是它遍历指针数组,查看指向的每个字符串中的第一个字符,(*++argv)[0]
现在解除引用*argv[0]
或第一个参数字符串的元素零。
所以,基本上我有三个问题:
此刻我对此感到非常困惑,并尝试了我能想到的一切来解决这个问题。有一次我有一个打印字母表的循环,我不知道程序访问的内存部分。最有趣的排列是从某个地方提取sshid变量。
先谢谢大家的帮助。
答案 0 :(得分:6)
++argv
更改argv
以指向下一个参数。
尝试类似
的内容int i = 0;
while(--argc && argv[++i][0] == '-')
其中维护一个单独的索引,而不是覆盖argv
。
或者
char** argp = argv;
while(--argc && (*++argp)[0] == '-')
与原作相同,但它会更改argv
的副本而不是原始副本。