扫描到新行

我想读取输入的所有文本,直到输入换行符。

这是我的代码。

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