user-0 提问: 关于过滤换行符的问题

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  不要写连自己也预测不了结果的代码！

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  不要写连自己也预测不了结果的代码！谢谢，有时候这类言论也起到很重要的指导作用。

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:scanf是格式化输入，由于'\n'不匹配%d，所以会一直在输入缓存里，直到被ch接收； 第二个getchar就是起到吸收'\n'，然后才能继续循环。否则遇到ch = getchar()得到'\n'就会退出循环。 感谢回答，相互学习！

user: user-0
content: 引用 3 楼 user-3 的回复:首先，你的代码需要稍稍修改，才能运行 #include<stdio.h>  void display(char cr,int lines,int width) {     int row,col;     for(row=1;row<=lines;row++)     {         for(col = 1; col <= width; col++)             putchar(cr);         putchar('\n');     }    //结束一行并开始新的一行 }  int main(void) {     int ch;             //待打印字符     int rows,cols;  //行数和列数      printf("Enter a character and two integers:\n");     while((ch=getchar()) != '\n')     {         if(scanf("%d %d",&rows,&cols) != 2)             break;         display(ch,rows,cols);         while(getchar() != '\n')             continue;         printf("Enter another character and two integers:\n");         printf("Enter a newline to quit.\n");     }     printf("bye.\n");     return 0;  }  第二，你说的对，如果注释掉main函数中的while(getchar()!='\n')  continue;  这两句，则程序在输入完c 2 3                //c（空格）2（空格）3（回车）就直接退出了。  第三，关于你的问题：请问while(getchar()!='\n')  continue;  这两句对回车做了什么，在最后一个回车的时候while(getchar()!='\n')不是直接跳过吗？  当你的程序在运行时输入C 2 3（回车）之后，缓冲区中的内容为：C 2 3 （回车）。字符c在ch=getchar()被读取到ch中，2和3也由scanf("%d %d",&rows,&cols) != 2被读取到rows和cols之中，那么缓冲区中还剩下一个(回车)。while(getchar()!='\n')  continue; 就是把这个回车读入，然后吃掉，不然这个回车要留到while循环，会导致程序退出。这就回到上面的第二点去了。  其实，while(getchar()!='\n')  continue; 的作用，是把你正常输入之后所产生的乱七八糟的输入一直到回车全部干掉。比如，你的正常输入应该是c 2 3(回车)，那么它就干掉这个回车，如果你的输入是c 2 3 d 5 6 x y z(回车)，这个语句的作用就是把你输入的 d 5 6 x y z(回车)从你的缓冲区里吃掉，那么你的程序就仍然可以正常运行。非常感谢你认真细致的回答，学习了，正是我想要的答案！  ^-^

user: user-2
content: scanf是格式化输入，由于'\n'不匹配%d，所以会一直在输入缓存里，直到被ch接收； 第二个getchar就是起到吸收'\n'，然后才能继续循环。否则遇到ch = getchar()得到'\n'就会退出循环。

user: user-3
content: 首先，你的代码需要稍稍修改，才能运行 #include<stdio.h>  void display(char cr,int lines,int width) {     int row,col;     for(row=1;row<=lines;row++)     {         for(col = 1; col <= width; col++)             putchar(cr);         putchar('\n');     }    //结束一行并开始新的一行 }  int main(void) {     int ch;             //待打印字符     int rows,cols;  //行数和列数      printf("Enter a character and two integers:\n");     while((ch=getchar()) != '\n')     {         if(scanf("%d %d",&rows,&cols) != 2)             break;         display(ch,rows,cols);         while(getchar() != '\n')             continue;         printf("Enter another character and two integers:\n");         printf("Enter a newline to quit.\n");     }     printf("bye.\n");     return 0;  }  第二，你说的对，如果注释掉main函数中的while(getchar()!='\n')  continue;  这两句，则程序在输入完c 2 3                //c（空格）2（空格）3（回车）就直接退出了。  第三，关于你的问题：请问while(getchar()!='\n')  continue;  这两句对回车做了什么，在最后一个回车的时候while(getchar()!='\n')不是直接跳过吗？  当你的程序在运行时输入C 2 3（回车）之后，缓冲区中的内容为：C 2 3 （回车）。字符c在ch=getchar()被读取到ch中，2和3也由scanf("%d %d",&rows,&cols) != 2被读取到rows和cols之中，那么缓冲区中还剩下一个(回车)。while(getchar()!='\n')  continue; 就是把这个回车读入，然后吃掉，不然这个回车要留到while循环，会导致程序退出。这就回到上面的第二点去了。  其实，while(getchar()!='\n')  continue; 的作用，是把你正常输入之后所产生的乱七八糟的输入一直到回车全部干掉。比如，你的正常输入应该是c 2 3(回车)，那么它就干掉这个回车，如果你的输入是c 2 3 d 5 6 x y z(回车)，这个语句的作用就是把你输入的 d 5 6 x y z(回车)从你的缓冲区里吃掉，那么你的程序就仍然可以正常运行。