扫描到新行
我想读取输入的所有文本,直到输入换行符。
这是我的代码。
int i=0; char ch[MAX]; printf("Enter the text\n"); while(true) { scanf("%c",&ch[i]); if(ch[i]=='\n') break; i++; }
但是当我尝试执行它时只读一个单词。
我也试过scanf("%s",ch);
但结果是一样的。
在依赖ch[i]
获得有效值之前,你没有检查scanf()
成功,这不是一个好主意。
只需使用fgets()
一次读取整行。
将评论转移到答案。
你的代码会起作用。 您发布的代码扫描所有内容,直到找到换行符( \n
)。 但正如Jonathan Leffler评论的那样,你绝不会NUL终止你的字符串。 要做到这一点,只需使用
ch[i]='\0';
循环之后。 此外,用户可以输入比MAX-1
更多的字符(最后一个用于\0
),这可能会导致缓冲区溢出 。 你应该添加一个支票
if(i==MAX-1) break;
就在您的scanf
之前,以防止它溢出。
注意scanf("%s",ch);
将扫描,直到遇到空格或换行符。
不要逐个字符地循环和扫描,只需使用
scanf("%[^\n]",ch); getchar();
上面的scanf
扫描所有内容,直到找到换行符并将它们放入ch
。 然后getchar()
从stdin
丢弃\n
。 您还可以通过限制scanf
读入ch
的字符数来提高安全性。
scanf("%49[^\n]",ch);
上面的scanf
最多扫描49个字符,并在最后添加\0
。 您可以在那里替换MAX-1
的值。 我用50作为例子。
正如@Jonathan Leffler评论的那样,OP的代码不会使字符串终止或阻止缓冲区溢出。
由于代码一次获取1个char
,因此使用更简单的fgetc()
。
int i=0; char ch[MAX]; int single; // Important that this in an int to distinguish EOF from input. printf("Enter the text\n"); while((single = fgetc(stdin)) != EOF) { if (i >= (MAX-1)) { ; // Too many, do not save or maybe indicate error } else { ch[i++] = single; } if (single == '\n') { break; } } ch[i] = '\0'; // Add termination
你的代码工作正常。 我检查过,它读的是一行而不是单词。
我希望你的代码对你更好:
int main() { int i=0; char ch[100]; printf("Enter the text\n"); gets(ch); // input text puts(ch); // output text return 0; }
输入: asdf ghjkl zxcvb
输出: asdf ghjkl zxcvb