我是C的初学者,并且一直试图弄清楚我的代码在过去一两个小时里出了什么问题。我一直在关注K& Rs的书,我一直在仔细研究它,但仍然不理解我的逻辑错误。
while (*argv>0){
while (**argv>0){
printf("%c\n",**argv);
**argv++;
}
argv++;
}
任务:使用argv打印输出到我程序的所有参数。
据我所知,argv是一个指向数组的指针,该数组包含指向字符指针数组的更多指针。所以,我说虽然* argv> 0或者当第一个数组仍然有元素时,我们应该遵循从第一个数组到下一个数组的指针。然后我们应该打印出下一个数组中的所有元素。
答案 0 :(得分:11)
这一行太多*:
**argv++;
应该是这样的:
*argv++;
另外还有大括号,因为++
操作具有更高的优先级:
(*argv)++;
它会起作用。
答案 1 :(得分: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]
,这是该程序的名称/路径。
现在我的代码做了什么?当for(i = 0; argv[i]; i++)
解析为false(即i
又名0
)时,argv[i]
从0
计算NULL
到该元素,这是最后一个元素argv
数组。然后对于数组中的每个元素,它使用%s
格式说明符printf
来打印它。您还可以将argv[i]
作为第一个也是唯一的参数传递给printf
,但这通常不赞成,因为它为某些字符串格式化攻击打开了大门。
答案 2 :(得分:6)
argv
的类型为char *argv[]
,即指向字符串数组(char*
)的指针。 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;
}
答案 3 :(得分: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
}