【问题标题】:Strlen() function giving "Segmentation Fault" errorStrlen() 函数给出“分段错误”错误
【发布时间】:2017-05-29 18:13:28
【问题描述】:

这是我的代码:

int c;
char b[c];

scanf("%s",b);
c=strlen(b);

printf("\n");
printf("%s\n",b);

当我执行它时,它一直给我一个“分段错误(核心转储)”错误。我不想事先定义字符串大小。我希望程序在我写完字符串后确定它。

非常感谢所有帮助。

【问题讨论】:

    标签: segmentation-fault strlen


    【解决方案1】:

    这个

    int c;
    char b[c];
    

    给你未定义的行为,因为c 未初始化,但随后用作b 的数组大小。未定义的行为意味着之后可能会发生任何事情,包括运行一段时间正常,然后稍后进行核心转储。

    听起来你想要的是从输入中确定字符串长度,但你不能用 C 中的数组来做到这一点,因为数组大小是恒定的,在声明数组时确定。相反,您需要使用动态分配的缓冲区,当您读取字符串时,您可以根据需要调整其大小。如果您使用的是 POSIX,则可以让 stdio 库在您的 scanf 调用中使用 m 修饰符为您执行此操作:

    char *b;
    if (scanf("%ms", &b) > 0) {
        printf("%s\n", b);
        free(b); }
    

    如果您不使用 POSIX C,则需要先分配一个比可能需要的缓冲区更大的缓冲区(然后可以选择调整它的大小),或者根本不使用 scanf。

    【讨论】:

    • 感谢您的快速回复。我的程序应该:提示我编写一个包含尽可能多的字符的字符串,然后确定该字符串的大小,从而用它的实际大小更新“b”。我不想预先声明大小,也不想设定任何限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2013-01-03
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多