C中scanf和字符串的分段错误

Posted

技术标签:

【中文标题】C中scanf和字符串的分段错误【英文标题】:Segmentation fault with scanf and strings in C 【发布时间】:2014-12-04 23:59:48 【问题描述】:

我是 c 的初学者,但我遇到了 scanf 和字符串的问题。

这是我写的一个关于我的问题的例子。

#include <stdio.h>
#include <string.h>

int main(void)

    char* string;
    scanf("%s", &string);
    if (strcmp(string, "Foo") == 0)  //segmentation fault here
        printf("Bar");

基本上,这段代码可以编译,但是当我运行它时,我在 strcmp() 中遇到了分段错误

如果我用“&string”替换该行中的“string”,它可以工作,但是我从编译器得到这个错误

/usr/include/stdio.h:362:12: note: expected 'const char * __restrict__' but argument is of type 'char **'

这让我觉得这个解决方案并不理想。

如果我这样声明字符串:

char string[100];

它可以在没有任何警告的情况下工作,但这也不理想,因为我不确定字符串会有多大。

我在这里缺少更好的解决方案吗,或者这些是我唯一的选择吗?

谢谢。

【问题讨论】:

阅读一本书 - C 不是一种通过反复试验来学习的语言。 (在许多情况下,如果你出错了,你的程序会默默地工作,或者给出令人困惑的结果;结果你最终会得到不正确的心智模型,并且永远无法理解数组和指针之间的区别等等。) 您需要声明足够大的字符串(如您所料),但有多大?阅读有关 malloc 的信息。如果您将字符串声明为 char string[1];您可能有一个程序有时可以运行,但由于存储 sscanf() 的字符串的位置太小而失败... 【参考方案1】:
char* string;
scanf("%s", &string);

string 没有指向任何有效的内存位置。使用malloc 将内存分配给字符数组并将输入复制到其中。确保分配的内存有空终止字符的空间。记得free内存以避免泄漏。

【讨论】:

或者只是在堆栈上创建一个char 的数组并避免malloc 好的,这行得通。有没有办法可以根据用户输入的字符串的大小来分配内存?这样我就不必猜测字符串会有多大了【参考方案2】:

试试那个代码

     #include <stdio.h>
     #include <string.h>
     #include <stdlib.h>
     int main(void)
     
       char* string;
       string=(char *)malloc(3); /*allocate the memory to string cahr pointer(default pointer point to single byte and if you print pointer variable don't used & character)*/                                                      
       scanf("%s", string);
       if (strcmp(string, "Foo") == 0)  
            printf("Bar\n");
     

【讨论】:

3 对于malloc-ed 字符串缓冲区来说不是一个合理的大小。至少应该是 4。【参考方案3】:

在声明一个 char *.它不会有任何内存位置。所以你必须分配一个 使用该变量之前的内存位置。 字符 *p; p=malloc(sieof(char) * 字符串大小);

然后你使用 scanf() 函数。它会正常工作。

当我们访问未知内存(即未分配的内存)时。那么它将通过分段错误

【讨论】:

以上是关于C中scanf和字符串的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C从键盘读取字符串?

为啥这个字符串反转 C 代码会导致分段错误? [复制]

使用字符串时的c ++初学者分段错误

带有向量和字符串的 C++ 分段错误

C++ std 线程和列表分段错误(核心转储)

什么原因导致C中出现分段错误(核心转储)?