user-0 提问: 一个scanf的问题

回复:
user: user-0
content: 引用 13 楼 lgbxyz 的回复:[quote=引用 12 楼 zzzrrr1989 的回复:] 恩，这个是对的~~  你明白为什么加一个getchar() 就OK了?[/quote] -------------------------------------------------------------- 如果是%s的话，可以不用getchar()；但是%[^\n]的话，\n会一直留在输入缓冲区，然后一直循环~~或者像另一位写的，在%[^\n]前面加上空格，使其不匹配单个\n。

user: user-0
content: 引用 13 楼 lgbxyz 的回复:[quote=引用 12 楼 zzzrrr1989 的回复:] 恩，这个是对的~~  你明白为什么加一个getchar() 就OK了?[/quote] ------------------------------------------------------- 把缓冲区最后一个字符取走...

user: user-1
content: 引用 12 楼 zzzrrr1989 的回复:恩，这个是对的~~  你明白为什么加一个getchar() 就OK了?

user: user-0
content: 引用 8 楼 lgbxyz 的回复:终于明白你的意思了  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  #define TRUE 1 #define FALSE 0   char const CHARACTER_TABLE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";   int prepare_key(char *key);  int main( int argc, char *argv[] ){ 	char input_letter[27]; 	char *buf; 	 	do { 		memset(input_letter, 0x00, 27); 		printf("Please input a letter: ");         scanf("%[^\n]", input_letter);         getchar(); //get '\n' 	}while ( prepare_key(input_letter)==FALSE );  	printf("The input letter is %s\n", input_letter);  	return EXIT_SUCCESS; }   /*  * if input letter is empty or contains un-alpha characters, or its length surpasses 26, just return FALSE  * */ int prepare_key(char *key){ 	if ( strlen(key)>26 || strlen(key)==0 ){ 		return FALSE; 	} else { 		while ( *key!='\0' ){ 			if ( !isalpha(*key) ){ 				return FALSE; 			} 			key++; 		} 		return TRUE; 	} }   ---------------------------------------------------------------------------------------------------- 恩，这个是对的~~

user: user-0
content: 引用 7 楼 dooX8086 的回复:rewind(stdin); 应该可以吧！！！！不行的话就这样 格式控制符前加多个空格在前面 scanf(" %[^\n]", input_eletter);   "这里加个空格%[^\n]"  其实它就是  gets(input_eletter) ------------------------------------------------------------------ rewind(stdin); 这个确实没用；加空格有用。

user: user-0
content: 引用 7 楼 dooX8086 的回复:rewind(stdin); 应该可以吧！！！！不行的话就这样 格式控制符前加多个空格在前面 scanf(" %[^\n]", input_eletter);   "这里加个空格%[^\n]"  其实它就是  gets(input_eletter) ------------------------------------------------------------------------ 我知道gets或者fgets可以实现，我主要是疑惑为什么这里用scanf会有为题~~我再试试。

user: user-1
content: 终于明白你的意思了  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  #define TRUE 1 #define FALSE 0   char const CHARACTER_TABLE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";   int prepare_key(char *key);  int main( int argc, char *argv[] ){ 	char input_letter[27]; 	char *buf; 	 	do { 		memset(input_letter, 0x00, 27); 		printf("Please input a letter: ");         scanf("%[^\n]", input_letter);         getchar(); //get '\n' 	}while ( prepare_key(input_letter)==FALSE );  	printf("The input letter is %s\n", input_letter);  	return EXIT_SUCCESS; }   /*  * if input letter is empty or contains un-alpha characters, or its length surpasses 26, just return FALSE  * */ int prepare_key(char *key){ 	if ( strlen(key)>26 || strlen(key)==0 ){ 		return FALSE; 	} else { 		while ( *key!='\0' ){ 			if ( !isalpha(*key) ){ 				return FALSE; 			} 			key++; 		} 		return TRUE; 	} }

user: user-2
content: Please input a letter: hel lo Please input a letter: hello The input letter is hello 请按任意键继续. . .  ------------------------------------ 这样是否是想要的结果

user: user-2
content: rewind(stdin); 应该可以吧！！！！不行的话就这样 格式控制符前加多个空格在前面 scanf(" %[^\n]", input_eletter);   "这里加个空格%[^\n]"  其实它就是  gets(input_eletter)

user: user-0
content: 引用 5 楼 lgbxyz 的回复:反正hel lo好用 ------------------------------------------------ 你输入"hel  lo"正确应该输出的是“Please input a letter: ”，就是让你重新输，而不是printf("The input letter is %s\n", input_letter);

user: user-1
content: 反正hel lo好用

user: user-0
content: 引用 1 楼 user-3 的回复:rewind(stdin); scanf("%[^\n]", input_letter);  清除一下输入缓冲区，每次scanf 遇\n  读取前面内容，一直没有清\n, 每次到scanf就自动判断读取结束 ----------------------------------------------------------------------- 没有诶，fflush(stdin)这个也没用~~你可以跑下我代码试试？

user: user-0
content: 引用 2 楼 lgbxyz 的回复: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  #define TRUE 1 #define FALSE 0   char const CHARACTER_TABLE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";   int prepare_key(char *key);  int main(int argc, char *argv[]) { 	char input_letter[27] = {0}; 	 	do  	{ 		printf("Please input a letter: "); 		scanf("%[^\n]", input_letter); 	} 	while (prepare_key(input_letter)==TRUE);  	printf("The input letter is %s\n", input_letter);  	exit(EXIT_SUCCESS); }   /*  * if input letter is empty or contains un-alpha characters, or its length surpasses 26, just return FALSE  * */ int prepare_key(char *key) { 	if ( strlen(key)>26 || strlen(key)==0 ) 	{ 		return FALSE; 	}   	while ( *key!='\0' ) 	{ 		if ( !isalpha(*key) ) 		{ 			return FALSE; 		} 		key++; 	} 	return TRUE; }    --------------------------------------------------------------------------------------------- 请问你试过了么？

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  #define TRUE 1 #define FALSE 0   char const CHARACTER_TABLE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";   int prepare_key(char *key);  int main(int argc, char *argv[]) { 	char input_letter[27] = {0}; 	 	do  	{ 		printf("Please input a letter: "); 		scanf("%[^\n]", input_letter); 	} 	while (prepare_key(input_letter)==TRUE);  	printf("The input letter is %s\n", input_letter);  	exit(EXIT_SUCCESS); }   /*  * if input letter is empty or contains un-alpha characters, or its length surpasses 26, just return FALSE  * */ int prepare_key(char *key) { 	if ( strlen(key)>26 || strlen(key)==0 ) 	{ 		return FALSE; 	}   	while ( *key!='\0' ) 	{ 		if ( !isalpha(*key) ) 		{ 			return FALSE; 		} 		key++; 	} 	return TRUE; }

user: user-3
content: rewind(stdin); scanf("%[^\n]", input_letter);  清除一下输入缓冲区，每次scanf 遇\n  读取前面内容，一直没有清\n, 每次到scanf就自动判断读取结束