2014-12-04 37 views
-1

我是一个初学者,并且我遇到了scanf和字符串的问题。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()得到一个分段错误

,如果我替换为“&串”它的工作原理该行的“弦”,但我从编译器得到这个错误

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

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

另外,如果我声明的字符串是这样的:

char string[100]; 

,没有任何警告的作品,但这也并不理想,因为我不知道该字符串多大将是。

有没有更好的解决方案我在这里失踪,还是这些是我唯一的选择?

谢谢。

+1

读一本书 - C是不是一个语言,通过试验和错误学习。 (在许多情况下,如果出现错误,程序将默默工作,或给出令人困惑的结果;结果导致错误的心理模型以及对数组和指针之间差异的永久理解等) – 2014-12-05 01:49:30

+0

你需要声明足够大的字符串(正如你猜测的那样),但是有多大?阅读关于malloc。如果你将字符串声明为char string [1];你可能有一个有效的程序,但有时却失败了,因为你存储sscanf()'ed字符串的位置太小... – ChuckCottrill 2014-12-05 02:33:47

回答

1
char* string; 
scanf("%s", &string); 

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

+0

或者只是在堆栈上创建一个'char'数组,避免使用'malloc '。 – StilesCrisis 2014-12-05 00:18:46

+0

好的,那是有效的。有没有一种方法可以根据用户输入的字符串的大小分配内存?这样我就不必猜测字符串有多大也是 – bbm21 2014-12-05 01:16:53

+0

也不要用'&' – 2014-12-05 01:48:26

1

试试看代码

 #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"); 
    } 
+0

3对于一个'malloc'编辑的字符串缓冲区来说不是一个合理的大小。它至少应该是4。 – 2014-12-05 06:17:56

0

虽然宣布一个char *。它不会有任何内存位置。所以您必须在使用该变量之前分配一个 内存位置。 char * p; p = malloc(sieof(char)* string的大小);

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

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