来自argc的C分段故障



我目前正在尝试对我的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("%cn", 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)成立时,才会执行主体。

相关内容

  • 没有找到相关文章

最新更新