如何读取用户在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
缓冲区。