我似乎无法解决问题.我错过了什么?
考虑以下
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"天阵没有性的影响.
我错过了什么?
您的代码中有几个错误:
变量argv和常量之间存在差异days.变量可以改变,常数阵列标签 - 不能.
在您的数组中,数组末尾缺少终止符NULL.
*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)
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)
| 归档时间: |
|
| 查看次数: |
2249 次 |
| 最近记录: |