我怎样才能读取未知长度的inputstring?

如果我不知道这个词有多长时间,我不能写char m[6];
这个词的长度可能是十到二十长。 我如何使用scanf从键盘input?

 #include <stdio.h> int main(void) { char m[6]; printf("please input a string with length=5\n"); scanf("%s",&m); printf("this is the string: %s\n", m); return 0; } 

请inputlenght = 5的string
你好
这是string:你好

input时确保dynamic地区

例如

 #include <stdio.h> #include <stdlib.h> char *inputString(FILE* fp, size_t size){ //The size is extended by the input with the value of the provisional char *str; int ch; size_t len = 0; str = realloc(NULL, sizeof(char)*size);//size is start size if(!str)return str; while(EOF!=(ch=fgetc(fp)) && ch != '\n'){ str[len++]=ch; if(len==size){ str = realloc(str, sizeof(char)*(size+=16)); if(!str)return str; } } str[len++]='\0'; return realloc(str, sizeof(char)*len); } int main(void){ char *m; printf("input string : "); m = inputString(stdin, 10); printf("%s\n", m); free(m); return 0; } 

用今天的电脑,你可以摆脱分配非常大的string(数十万个字符),而几乎不影响计算机的RAM使用率。 所以我不会太担心。

然而,在过去,当记忆很重要时,通常的做法是以大块的forms阅读string。 fgets从input中读取最多的字符数,但保持input缓冲区的其余部分不变,所以你可以从其中读取其余的部分。

在这个例子中,我读了200个字符的块,但是当然你可以使用任何你想要的块大小。

 #include <stdio.h> #include <stdlib.h> #include <string.h> char* readinput() { #define CHUNK 200 char* input = NULL; char tempbuf[CHUNK]; size_t inputlen = 0, templen = 0; do { fgets(tempbuf, CHUNK, stdin); templen = strlen(tempbuf); inputlen += templen; input = realloc(input, inputlen+1); strcat(input, tempbuf); } while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n'); return input; } int main() { char* result = readinput(); printf("And the result is [%s]\n", result); free(result); return 0; } 

请注意,这是一个没有错误检查的简单示例。 在现实生活中,您将不得不通过validationfgets的返回值来确保input正确。

另外请注意,如果是readinput例程,则不会有字节被浪费; 该string具有所需的确切内存大小。

如果我可以build议一个更安全的方法:

声明一个足够容纳string的缓冲区:

char user_input[255];

安全的方式获取用户input:

fgets(user_input, 255, stdin);

一个安全的方法来获得input,第一个参数是一个指向缓冲区的指针,其中input将被存储,第二个函数应该读取的最大input,第三个是指向标准input的指针 – 即用户input来自哪里从。

特别是安全性来自第二个参数,限制了多less将会被读取,从而防止缓冲区溢出。 此外, fgets负责空处理已处理的string。

更多关于这个function的信息

编辑:如果你需要做任何格式(例如将一个string转换为数字),你可以使用atoi一旦你有input。

我只看到一个简单的方法来读取一个任意长的string,但我从来没有使用过。 我认为这是这样的:

 char *m = NULL; printf("please input a string\n"); scanf("%ms",&m); if (m == NULL) fprintf(stderr, "That string was too long!\n"); else { printf("this is the string %s\n",m); /* ... any other use of m */ free(m); } 

%s之间的m告诉scanf()测量string并为其分配内存,并将string复制到该string中,并将分配内存的地址存储在相应的参数中。 一旦你完成了它,你必须free()它。

尽pipe如此, scanf()每个实现都不支持。

正如其他人所指出的,最简单的解决scheme是设置input长度的限制。 如果你仍然想使用scanf()那么你可以这样做:

 char m[100]; scanf("%99s",&m); 

请注意, m[]的大小必须至less比%s之间的数字大一个字节。

如果input的string长度超过了99,那么剩下的字符将等待被另一个调用或传递给scanf()的其余格式string读取。

通常scanf()不build议用于处理用户input。 最适用于由另一个应用程序创build的基本结构化文本文件。 即使那样,你也必须意识到,input可能没有按照你的预期格式化,因为有人可能会干涉它,试图破坏你的程序。

更安全,更快(倍增容量)版本:

 char *readline(char *prompt) { size_t size = 80; char *str = malloc(sizeof(char) * size); int c; size_t len = 0; printf("%s", prompt); while (EOF != (c = getchar()) && c != '\r' && c != '\n') { str[len++] = c; if(len == size) str = realloc(str, sizeof(char) * (size *= 2)); } str[len++]='\0'; return realloc(str, sizeof(char) * len); } 

拿一个字符指针来存储需要的string。如果你对string的可能大小有一些想法,那么使用函数

 char *fgets (char *str, int size, FILE* file);` 

否则你也可以在运行时使用malloc()函数来dynamic地提供请求的内存。

fgets()直接读入分配的空间。

需要特别注意的是区分成功的读取,文件结束,input错误和内存不足。 在EOF上需要适当的内存pipe理。

此方法保留一行'\n'

 #include <stdio.h> #include <stdlib.h> #define FGETS_ALLOC_N 128 char* fgets_alloc(FILE *istream) { char* buf = NULL; size_t size = 0; size_t used = 0; do { size += FGETS_ALLOC_N; char *buf_new = realloc(buf, size); if (buf_new == NULL) { // Out-of-memory free(buf); return NULL; } buf = buf_new; if (fgets(&buf[used], (int) (size - used), istream) == NULL) { // feof or ferror if (used == 0 || ferror(istream)) { free(buf); buf = NULL; } return buf; } size_t length = strlen(&buf[used]); if (length + 1 != size - used) break; used += length; } while (buf[used - 1] != '\n'); return buf; } 

示例用法

 int main(void) { FILE *istream = stdin; char *s; while ((s = fgets_alloc(istream)) != NULL) { printf("'%s'", s); free(s); fflush(stdout); } if (ferror(istream)) { puts("Input error"); } else if (feof(istream)) { puts("End of file"); } else { puts("Out of memory"); } return 0; } 

我知道我已经到了四年了,为时已晚,但我想我还有别的方法可以使用。 我曾经使用过像这样的getchar()函数: –

 #include <stdio.h> #include <stdlib.h> #include <string.h> //I had putten the main Function Bellow this function. //d for asking string,f is pointer to the string pointer void GetStr(char *d,char **f) { printf("%s",d); for(int i =0;1;i++) { if(i)//Ie if i!=0 *f = (char*)realloc((*f),i+1); else *f = (char*)malloc(i+1); (*f)[i]=getchar(); if((*f)[i] == '\n') { (*f)[i]= '\0'; break; } } } int main() { char *s =NULL; GetStr("Enter the String:- ",&s); printf("Your String:- %s \nAnd It's length:- %lu\n",s,(strlen(s))); free(s); } 

这里是这个程序的示例运行:

 Enter the String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!! Your String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!! And It's length:- 67