2013-01-10 96 views
1

从标准输入以任意长度的输入,因此,采取用户键盘输入的CI的方式之一知道如下:使用scanf函数

char buffer[LENGTH_KNOWN] = ""; 
scanf("%s",buffer); 

我想知道是否有任何方式把任意长度的用户输入。我尝试了如下的东西,但最终我得到了段错误。

char* buffer = ""; 
scanf("%s",buffer); 
printf("%s",buffer); 

然而,这似乎工作:

char* buffer = "TEST........keeps going....................." 
scanf("%s",buffer); 
printf("%s",buffer); 

任何人都可以解释为什么我收到此错误,是否有任何简单的方法来SCANF任意用户输入不使用malloc和检查缓冲区溢出?

在此先感谢!

+0

什么是要标记任意长度输入的结束?任意长度如何随意? 1 KiB; 4 KiB; 4 MiB; 4 GiB; 4 TiB;大?如果LENGTH_KNOWN是4096(或更大),你可以用'%4095s'来保护自己免受伤害。您可能希望使用'%4095 [^ \ n] \ n'在该缓冲区中最多读取4095个非换行符,然后再使用换行符。 –

回答

3

其实这两者都是错误的,因为你不能写入字符串文字(在你的例子中buffer都指向字符串文字)。

通过一个单独的scanf无法获得任意长度的输入。您需要在循环中获得输入并继续添加到真实的缓冲区中。

有没有简单的出路SCANF任意用户输入不使用 malloc和检查缓冲区溢出

使用现成的函数,它会为你。像getline(3)(非标准不幸)。

ssize_t getline (char **lineptr, size_t *n, FILE *stream) 

该函数读取来自流一整行,在缓冲器中存储 文本 (包括换行和终止空字符),并在*lineptr存储缓冲器地址。

1

char *buffer = "...";是完全错误的。这不是如何分配内存,因为双引号中的内容是字符串文本,并且是只读的。使用malloc

char buffer[1024]; 

或动态:您可以这样分配内存

char *buffer = malloc(1024); 

/* .... */ 

free(buffer); 
1
char* buffer = ""; 
scanf("%s",buffer); 
printf("%s",buffer); 

在为缓冲区上面你的代码不分配内存,所以对于缓冲区分配内存和将值读入缓冲区。

0

你永远不知道你可能读取多少字节,并相应地分配内存。所以我想你需要在一个循环中获得输入并将其添加到缓冲区中。

0
char* buffer; 

buffer = malloc(sizeof(char) * 1024); // 1024 is max user input length, or use whatever you want.. 

scanf("%s", buffer); 

buffer = realloc (buffer, strlen(buffer) + 1); // re-allocating the buffer according to user input..(+ 1 for counting NULL character) 

printf("%s",buffer);