我正在尝试对我的CS实验室进行编码,并且遇到了我看不到的Segmentation错误。我做的是蠢事还是什么?代码应该使用命令行args(“blah.exe hello world”)并输出它们周围的横幅。我们班级没有C的先验知识,但之前的数据结构课程。
示例输出
===============
= 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;
}
只需在没有参数的情况下运行就可以正常工作,但添加任何命令行参数会在打印任何内容之前产生分段错误。
答案 0 :(得分:5)
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
)成立时才执行正文。