如何从键盘读取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
而不是scanf
或fgets
因为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。