基本C指针

use*_*282 11 c pointers

我是C的初学者,并且一直试图弄清楚我的代码在过去一两个小时里出了什么问题.我一直在关注K&R的书,我一直在仔细研究它,但仍然不理解我的逻辑错误.

while (*argv>0){
    while (**argv>0){
        printf("%c\n",**argv);
        **argv++;
    }
    argv++;
}
Run Code Online (Sandbox Code Playgroud)

任务:使用argv打印输出到我的程序的所有参数.

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

小智 11

这一行太多了*:

**argv++;
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

*argv++;
Run Code Online (Sandbox Code Playgroud)

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

(*argv)++;
Run Code Online (Sandbox Code Playgroud)

它会奏效.


0xC*_*22L 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;
}
Run Code Online (Sandbox Code Playgroud)

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

现在我的代码做了什么?for(i = 0; argv[i]; i++)计数i0所述元件时argv[i]解析为假(即0也称为NULL),即所述的最后一个元素argv阵列.然后对于数组中的每个元素,它使用%s格式说明符printf来打印它.您也可以将argv[i]第一个也是唯一的参数传递给printf,但这通常不赞成,因为它为某些字符串格式化攻击打开了大门.

  • 传递字符串作为唯一的参数甚至不会产生很多正确的结果.例如,字符串"C:\never"将导致"C:"+换行+"永远". (2认同)
  • +1坚持晦涩的保证`argv [argc]`将是一个空指针. (2认同)

cha*_*m15 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;
}


Run Code Online (Sandbox Code Playgroud)