如何读取用户在c中input的string

我想读取我的用户使用C程序input的名称

为此我写道:

char name[20]; printf("Enter name:"); gets(name); 

但使用gets不好所以build议我一个更好的方法。

你不应该使用gets (或scanf的string大小无限),因为这会打开你的缓冲区溢出。 使用带有stdin句柄的fgets ,因为它允许限制将放置在缓冲区中的数据。

以下是我用来从用户input行的一小段代码:

 #include <stdio.h> #include <string.h> #define OK 0 #define NO_INPUT 1 #define TOO_LONG 2 static int getLine (char *prmpt, char *buff, size_t sz) { int ch, extra; // Get line with buffer overrun protection. if (prmpt != NULL) { printf ("%s", prmpt); fflush (stdout); } if (fgets (buff, sz, stdin) == NULL) return NO_INPUT; // If it was too long, there'll be no newline. In that case, we flush // to end of line so that excess doesn't affect the next call. if (buff[strlen(buff)-1] != '\n') { extra = 0; while (((ch = getchar()) != '\n') && (ch != EOF)) extra = 1; return (extra == 1) ? TOO_LONG : OK; } // Otherwise remove newline and give string back to caller. buff[strlen(buff)-1] = '\0'; return OK; } 

这使我可以设置最大的大小,将检测是否input了太多的数据,并将冲洗线的其余部分,所以它不会影响下一个input操作。

你可以用类似的东西来testing它:

 // Test program for getLine(). int main (void) { int rc; char buff[10]; rc = getLine ("Enter string> ", buff, sizeof(buff)); if (rc == NO_INPUT) { // Extra NL since my system doesn't output that on EOF. printf ("\nNo input\n"); return 1; } if (rc == TOO_LONG) { printf ("Input too long [%s]\n", buff); return 1; } printf ("OK [%s]\n", buff); return 0; } 

我认为读取用户inputstring的最好和最安全的方法是使用getline()

下面是一个例子,如何做到这一点:

 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *buffer = NULL; int read; unsigned int len; read = getline(&buffer, &len, stdin); if (-1 != read) puts(buffer); else printf("No line read...\n"); printf("Size read: %d\n Len: %d\n", read, len); free(buffer); return 0; } 

在POSIX系统上,如果可用,你可能应该使用getline

你也可以使用Chuck Falconer的公共领域的ggets函数,它提供了更接近于gets但没有问题的语法。 (Chuck Falconer的网站已经不存在,尽pipearchive.org有一个副本 ,而且我为ggets创build了自己的页面 。)

我发现一个简单而好的解决scheme:

 char*string_acquire(char*s,int size,FILE*stream){ int i; fgets(s,size,stream); i=strlen(s)-1; if(s[i]!='\n') while(getchar()!='\n'); if(s[i]=='\n') s[i]='\0'; return s; } 

它基于fgets,但是没有'\ n'和stdin额外的字符(replacefflush(stdin),在所有操作系统上都不起作用,如果你必须在这之后获取string的话)。

你可以使用scanf函数来读取string

 scanf("%[^\n]",name); 

我不知道其他更好的select接收string,

在BSD系统和Android上,你也可以使用fgetln

 #include <stdio.h> char * fgetln(FILE *stream, size_t *len); 

像这样:

 size_t line_len; const char *line = fgetln(stdin, &line_len); 

line不是空终止,并包含\n (或任何您的平台正在使用)。 stream在下一个I / O操作后,它变为无效。 您可以修改返回的line缓冲区。