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和字符串的分段错误的主要内容,如果未能解决你的问题,请参考以下文章