我目前正在尝试编写我的 CS 实验室代码,但遇到了一个我看不到的段错误。我是在做傻事还是什么?代码应采用命令行参数(“blah.exe hello world”)并在其周围带有横幅输出。我们类没有 C 的先验知识,但有数据结构的先验类(class)。
示例输出
===============
= hello world =
===============
来源:用 gcc -std=c99 -Wall bannerize.c 编译
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]) {
if(argc <= 1) {
return EXIT_FAILURE;
}
printf("TEST");
int row_length = argc + 3; //3 for space after last word and 2 extra border chars
for(int i = 1; i < argc; i++, row_length += strlen(argv[i]));
printf("TEST2");
char c;
while((c=getchar())!=EOF) {
printf("TEST3");
for(int i = 1; i < argc; i++, printf("%c", c));
printf("\n");
printf("%c ", c);
for(int i = 1; i < argc; i++, printf("%s ", argv[i]));
printf("%c\n", c);
for(int i = 1; i < argc; i++, printf("%c", c));
printf("\n");
}
return EXIT_SUCCESS;
}
在没有参数的情况下运行效果很好,但添加任何命令行参数都会在打印任何内容之前给出段错误。
最佳答案
for(int i = 1; i < argc; i++, printf("%s ", argv[i]))
这是一种编写for
的奇怪而扭曲的方式。考虑当 i == argc - 1
时会发生什么。您递增它,然后访问 argv[argc]
。这必然是 NULL。
代替这种神秘的(ZING!)编写 for 的方式,尝试使用实际的主体:
for(int i = 1; i < argc; i++) {
printf("%s ", argv[i]);
}
要注意的是,仅当条件 (i > argc
) 成立时,主体才会执行。
关于来自 argc 的 C 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689565/