如何从键盘读取string使用C? 在char *中传递分段错误

我想读取用户input的string。 我不知道string的长度。 由于在CI中没有string声明一个指针:

char * word; 

并使用scanf从键盘读取input:

 scanf("%s" , word) ; 

但是我得到了一个分段错误。

当长度未知时,如何从C中的键盘读取input?

你没有存储空间,只是一个悬挂的指针 。

更改:

 char * word; 

至:

 char word[256]; 

请注意256是一个任意的select – 这个缓冲区的大小需要大于你可能遇到的最大可能的string。

还要注意, fgets是一个更好的(更安全的)选项,然后scanf读取任意长度的string,因为它需要一个size参数,这反过来有助于防止缓冲区溢出:

  fgets(word, sizeof(word), stdin); 

我看不出为什么有build议在这里使用scanf() 。 只有向格式string添加限制参数(如%64s左右scanf()才是安全的。

更好的方法是使用char * fgets ( char * str, int num, FILE * stream );

 int main() { char data[64]; if (fgets(data, sizeof data, stdin)) { // input has worked, do something with data } } 

(另)

当从任何不知道长度的文件(包含stdin)中读取input时,通常最好使用getline而不是scanffgets因为getline将自动为您的string处理内存分配,只要您提供一个空指针来接收input的string。 这个例子将说明:

 #include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { char *line = NULL; /* forces getline to allocate with malloc */ size_t len = 0; /* ignored when line = NULL */ ssize_t read; printf ("\nEnter string below [ctrl + d] to quit\n"); while ((read = getline(&line, &len, stdin)) != -1) { if (read > 0) printf ("\n read %zd chars from stdin, allocated %zd bytes for line : %s\n", read, len, line); printf ("Enter string below [ctrl + d] to quit\n"); } free (line); /* free memory allocated by getline */ return 0; } 

相关部分是:

 char *line = NULL; /* forces getline to allocate with malloc */ size_t len = 0; /* ignored when line = NULL */ /* snip */ read = getline (&line, &len, stdin); 

line设置为NULL会导致getline自动分配内存。 示例输出:

 $ ./getline_example Enter string below [ctrl + d] to quit A short string to test getline! read 32 chars from stdin, allocated 120 bytes for line : A short string to test getline! Enter string below [ctrl + d] to quit A little bit longer string to show that getline will allocated again without resetting line = NULL read 99 chars from stdin, allocated 120 bytes for line : A little bit longer string to show that getline will allocated again without resetting line = NULL Enter string below [ctrl + d] to quit 

所以使用getline你不需要猜测你的用户string的长度。

你需要把指针指向某处来使用它。

试试这个代码:

 char word[64]; scanf("%s", word); 

这将创build一个长度为64的字符数组并读取input。 请注意,如果input长度超过64个字节,则字数组溢出,程序变得不可靠。

正如Jens指出的那样,最好不要使用scanf来读取string。 这将是安全的解决scheme。

 char word[64] fgets(word, 63, stdin); word[63] = 0; 
 #include<stdio.h> int main() { char str[100]; scanf("%[^\n]s",str); printf("%s",str); return 0; } input: print the string ouput: print the string 

如上所示,此代码打印出缺口的string。