user-0 提问: do while循环体内scanf函数被跳过，循环结束

回复:
user: user-1
content: #include<stdio.h> int main() {     char c;     printf("\n\n***************do while 开始***************\n\n");     do     {         printf("这是一个do while循环！\n");           printf("继续执行请输入y或Y，否则请输入其它\n");           scanf("%c",&c);         getchar();       }     while(c == 'y'||c == 'Y');     return 0; } 加个getchar接收回车

user: user-2
content: Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

user: user-2
content: 参考printf的源代码比如：C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-3
content: 引用 18 楼 zhao4zhong1 的回复:[quote=引用 16 楼 gblhack 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 请问赵老师： 在printf后面加fflush(stdout);可以起到什么作用，不加会产生什么后果[/quote] 不加可能被缓冲而不输出。[/quote] 这个不太理解，可以说的稍微具体点吗，或者这些属于哪方面的知识，我去了解一下。

user: user-2
content: 仅供参考：#include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>10) {             printf("Input too long(>9)!\n");             continue;         }         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }

user: user-2
content: 引用 16 楼 gblhack 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 请问赵老师： 在printf后面加fflush(stdout);可以起到什么作用，不加会产生什么后果[/quote] 不加可能被缓冲而不输出。

user: user-3
content: 引用 13 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 请问赵老师： 在printf后面加fflush(stdout);可以起到什么作用，不加会产生什么后果

user: user-4
content: scanf(" %c",&c);

user: user-5
content: 换行符的问题

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-6
content: line = gets() sscanf(line, fmt, args...)

user: user-7
content: while(c == 'y'||c == 'Y' || c=='\r' || c=='\n);

user: user-0
content: 引用 9 楼 paschen 的回复:[quote=引用 5 楼 qq_26496361 的回复:] rewind（stdin）； fflush（stdin）； 这两个试过了，还是没有解决啊，这个问题是怎么产生的，怎么跟书上写的scanf（）函数的使用方法不一样呢？求大声在指点指点，小弟菜鸟，一头雾水 。  问题我上面不是说了，scanf把回车也接收了，所以你下一次循环得到的值是\n，然后就退出循环了 再不行你这样可好：用getchar把\n接收了  #include<stdio.h> int main() { 	char c; 	printf("\n\n***************do while 开始***************\n\n"); 	do 	{ 		printf("这是一个do while循环！\n");  		printf("继续执行请输入y或Y，否则请输入其它\n");  		scanf("%c",&c); 		getchar();  	} 	while(c == 'y'||c == 'Y'); 	return 0; }[/quote] 这个方法把问题解决了，多谢啊，以后会注意的。

user: user-8
content: 引用 5 楼 qq_26496361 的回复:rewind（stdin）； fflush（stdin）； 这两个试过了，还是没有解决啊，这个问题是怎么产生的，怎么跟书上写的scanf（）函数的使用方法不一样呢？求大声在指点指点，小弟菜鸟，一头雾水 。  问题我上面不是说了，scanf把回车也接收了，所以你下一次循环得到的值是\n，然后就退出循环了 再不行你这样可好：用getchar把\n接收了  #include<stdio.h> int main() { 	char c; 	printf("\n\n***************do while 开始***************\n\n"); 	do 	{ 		printf("这是一个do while循环！\n");  		printf("继续执行请输入y或Y，否则请输入其它\n");  		scanf("%c",&c); 		getchar();  	} 	while(c == 'y'||c == 'Y'); 	return 0; }

user: user-9
content: 不过似乎真的没必要

user: user-9
content: “ %c" 加上一个空格看行不？ 从前 fortran 格式语句， 要加上1x 用于吃掉走纸控制符

user: user-0
content: 引用 2 楼 paschen 的回复:因为你输入'y'+回车后，他会接收了你的换行符，所以下一次循环取出的就是换行符 怎么会出现这种情况呢，平时写代码，输入字符，也没错啊，怎么和书上写的scanf函数使用方法不一样呢，头好晕。。

user: user-0
content: rewind（stdin）； fflush（stdin）； 这两个试过了，还是没有解决啊，这个问题是怎么产生的，怎么跟书上写的scanf（）函数的使用方法不一样呢？求大声在指点指点，小弟菜鸟，一头雾水 。

user: user-8
content: #include<stdio.h> int main() { 	char c; 	printf("\n\n***************do while 开始***************\n\n"); 	do 	{ 		printf("这是一个do while循环！\n");  		printf("继续执行请输入y或Y，否则请输入其它\n");  		scanf("%c",&c); 		fflush(stdin);   	} 	while(c == 'y'||c == 'Y'); 	return 0; }

user: user-10
content: 在scanf("%c",&c);上面加上rewind(stdin);