11

我是 C 语言的初学者,在过去一两个小时内一直试图找出我的代码出了什么问题。我一直在阅读 K&Rs 的书,我一直在看它,但仍然不明白我的逻辑错误。

while (*argv>0){
    while (**argv>0){
        printf("%c\n",**argv);
        **argv++;
    }
    argv++;
}

任务:打印出使用 argv 提供给我的程序的所有参数。

据我了解, argv 是一个指向数组的指针,其中包含指向字符指针数组的更多指针。所以,我说当 *argv>0 或者当第一个数组仍然有元素时,我们应该跟随从第一个数组到下一个数组的指针。然后我们应该打印出下一个数组中的所有元素。

4

4 回答 4

11

此行中的 * 太多:

**argv++;

它应该是这样的:

*argv++;

加上额外的大括号,因为++操作具有更高的优先级:

(*argv)++;

它会起作用。

于 2012-06-02T00:50:37.940 回答
9

我建议您不要像下标符号 ( []) 允许您这样做时那样使用指针取消引用来混淆自己。

#include <stdio.h>

int main(int argc, char** argv)
{
    int i;
    for(i = 0; argv[i]; i++)
        printf("%s\n", argv[i]);
    return 0;
}

这也将打印argv[0],这是程序的名称/路径。

现在我的代码做了什么?当解析为 false (即aka )时,从元素开始for(i = 0; argv[i]; i++)计数,即数组的最后一个元素。然后对于数组中的每个元素,它使用格式说明符来打印它。您也可以将作为第一个也是唯一的参数传递给,但这通常是不受欢迎的,因为它为某些字符串格式攻击打开了大门。i0argv[i]0NULLargv%sprintfargv[i]printf

于 2012-06-02T00:37:24.760 回答
6

argv是类型,char *argv[]即指向字符串数组(char*'s)的指针。argv++移动到数组中的下一个字符串。

通常这个函数会写成这样:


int main(int argc, char *argv[]){
   int i;
   for (i = 0; i < argc; i++){ //loop from 0 to argc (argument count)
      printf("%s ", argv[i]);
   }
   return 0;
}


于 2012-06-02T00:32:00.707 回答
2

这将工作::

while(argc--)//can't use *argv here, because *argv would be the  address of the 
              // element which argv is pointing to, just by knowing the address u can't say whether it still has elements or not
{
    while( **argv )
    {
        printf("%c", **argv);
        (*argv)++;  //by using **argv++, you are actually moving argv to next array, not to the next character of current array 
    }
    argv++;
    printf("\n");//move your \n to here, else you will end up printing every character in a new line
}
于 2012-06-02T00:57:27.980 回答