来自 argc 的 C 段错误

标签 c segmentation-fault

我目前正在尝试编写我的 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/

相关文章:

c - 使用指针和动态结构时出错

c - 获取c信息的好方法是什么?

c - linux读取系统调用没有得到EOF

c++ - 读取 gdb 中明确定义的值时出现段错误

c++ - 指针段错误

c++ - 没有 "const char*"的段错误

c - sizeof 作为字符串维度的段错误

c - 复制指针时出现段错误

c - 当数据变大时在c中搜索二叉树

c - C 中的段错误(数组相关)