在C中的数组指针中打印值

fiz*_*ink 7 c arrays pointers

我似乎无法解决问题.我错过了什么?

考虑以下

int main(int argc, char *argv[]) {
    while ( *argv ) {
        printf("argv[] is: %s\n", *argv);
        ++argv;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会打印出argv的每个值.所以命令行如./example arg1 arg2输出以下内容:

`argv[] is: ./example`
`argv[] is: arg1`
`argv[] is: arg2`
Run Code Online (Sandbox Code Playgroud)

现在考虑以下(我遇到麻烦):

int main(void) {
    char *days[] = {
        "Sunday",
        "Monday",
        "Tuesday"
    };
    while ( *days ) {
        printf("day is %s\n", *days);
        *days++;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试编译,我会收到错误 cannot increment value of type 'char *[3]'

如果我改变*days++(*days)++它编译.如果我运行它,它会永远运行并最终失败bus error.

但是,它不会遍历每个值days[].我甚至试图把一个空指针的形式'\0'"\0"天阵没有性的影响.

我错过了什么?

ole*_*rch 7

您的代码中有几个错误:

  1. 变量argv和常量之间存在差异days.变量可以改变,常数阵列标签 - 不能.

  2. 在您的数组中,数组末尾缺少终止符NULL.

  3. *days++;在这种情况下是毫无意义的.这是一个虚拟的,返回值days,然后增加days.只需使用即可days++.

因此,您的代码必须如下:

#include <stdio.h>

int main(void) {
    char *days[] = {
        "Sunday",
        "Monday",
        "Tuesday",
        NULL
    };

    // Your style
    char **d = days;
    while ( *d ) {
        printf("day is %s\n", *d);
        d++;
    }

    // Or, more "scholastic" code
    for(const char **d = days; *d; d++)
        printf("day is %s\n", *d);

    return 0;
Run Code Online (Sandbox Code Playgroud)


tdd*_*uru 6

argv []结构包含一个空指针作为最后一个条目,这就是代码工作的原因.您可以向数据结构添加空指针.您还需要意识到argv是一个参数(就像一个局部变量),它指向包含命令行参数的内部数据结构.您需要创建一个可以遍历数组的类似局部变量.

这是一个解决方案:

#include <stdio.h>
int main(void) {
    char *days[] = {"Sunday", "Monday", "Tuesday", 0 };
    char **v = days;

  while (v) {
    printf("day is %s\n", *v);
    v++;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)