user-0 提问: scanf录入浮点数组的问题

回复:
user: user-0
content: 最后贴出解决问题后的代码， 把fflush 改成了rewind解决了输入非数字死循环的问题 在判断中加入了对换行符的判断 if (c == 32 || c == 44 || c =='\n')，解决不能正确录入的问题 double f[2][3] = { 0.0 }; 	char c = 0; 	for (int i = 0; i < 2; i++) 	{ 		for (int j = 0, x = 0; j < 3; j++) 		{ 			if (scanf("%lf", &f[i][j]) == 1) 			{ 				c = getchar(); 				if (c == 32 || c == 44 || c =='\n')//本意是检测是否用空格或','间隔 					continue; 				else { printf("请用空格间隔两数：\n"); i = -1; rewind(stdin); break; } 			} 			else { printf("输入有误，请重新输入：\n"); i = -1; rewind(stdin);  break; } 			//如果未能读入一个double，则清空缓冲区，然后跳出，继续执行外部for 		} 	}

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }  老师的代码我大概看懂了，是把输入的数据先存入一个字符串里，然后再从字符串读取数据，只是我发帖的原意是想解决错误。 不过老师的输入方式确实挺好，以后借鉴，十分感谢。

user: user-0
content: 引用 1 楼 qq_29120981 的回复:第十三行输入的不是如果不是数字scanf尝试读取，然后读取失败并把那个字符留在缓冲区，所以你得在内层循环快结束时加个清空输入缓冲区。再者，用fflush清空输入缓冲区，它的行为是未定义的  谢谢，一直在vs下学习的c，现在才知道fflush(stdin)是msdn定义的  引用 2 楼 weixin_30460121 的回复:1、当输入最后一个数后，跟着输入的是回车‘\n’，所以c不等于空格或“，”，执行第一个else语句。 你说的这个问题在输入1 2 3 4 5 6的时候是不存在的，不知道为什么   引用 3 楼 paschen 的回复:猜想你说的循环可能是因为输入流被破坏了 循环的原因找到了，是因为使用了未定义的fflush(stdin)，导致没有成功清空输入缓冲区，换成rewind(stdin)就可以了

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

user: user-2
content: 第二个问题，说错了，没有看到fflush……

user: user-3
content: 猜想你说的循环可能是因为输入流被破坏了

user: user-2
content: 1、当输入最后一个数后，跟着输入的是回车‘\n’，所以c不等于空格或“，”，执行第一个else语句。 2、当你输入一个字母时scanf读取失败，直接跳到第二个else语句，由于字母一直存在缓存里，所以scanf一直重复读取失败，重复之行第二个else语句

user: user-4
content: 第十三行输入的不是如果不是数字scanf尝试读取，然后读取失败并把那个字符留在缓冲区，所以你得在内层循环快结束时加个清空输入缓冲区。再者，用fflush清空输入缓冲区，它的行为是未定义的

user: user-5
content: 引用 5 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }   scanf("%lf", &f[i][j])的问题，这个地方~~~~ scanf 不可以区分逗号分割  但是可以区分空格 分割 所以只要有逗号，基本上有问题呢~~~