user-0 提问: scanf格式字符为%f，但输入为符号时变死循环

回复:
user: user-0
content: 感谢各位的帮助，我现在对scanf又多了一些理解，现更正代码如下，再也不怕故意输错了 #include <stdio.h>  int main() { 	double d1,d2,d3; 	unsigned char op,noError=1;  	while(1) 	{ 		printf("请输入算式，如3+2等：");  		while(scanf("%lf%c%lf",&d1,&op,&d2)!=3) //scanf的返回值为正确获取的数据的个数量 		{ 			printf("输入错误，请输入包含两个数的算式，如3+2等："); 			rewind(stdin);	//当输错式子时，清空输入缓存，以免死循环 		}  		rewind(stdin);		//当故意输入超过两个数的算式时，不清空缓存会导致下一次计算出错  		switch(op) 		{ 			case '+':d3=d1+d2;break; 			case '-':d3=d1-d2;break; 			case '*':d3=d1*d2;break; 			case '/':	if(d2!=0) 									d3=d1/d2; 								else 								{ 									printf("除数不能为0！\n"); 									noError = 0; 								} 								break; 			default :printf("输入错误，请重新输入！");noError = 0; 		} 		if(noError) 			printf("%-5.2f%c%-5.2f=%-5.2f\n",d1,op,d2,d3);  		noError = 1; 	}   return 0; }

user: user-1
content: 输入格式校验的水很深！ 我预测AI在10年内都搞不定。 程序员都因此而不会失业。

user: user-1
content: 再供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-2
content: 简单点说意思大概是这样的：scanf 想要一个固定格式的输入， 但是你输入错误了，所以第一次循环的时候，scanf 并没有消耗掉你输入的字符串，那么你输入的错误字符串仍然存在，并且等待被消耗，这个时候你的 while 又开始循环了，也就是你每一次循环，scanf 都在你输入的错误字符串中寻找答案，但是都没有找到， 于是错误的字符串还在输入缓存里，rewind 大概的意思，把输入缓存（实际上是输入流，输入缓存是为了方便你理解，两者差别很大）清空，这样scanf 发现输入缓存中没有东西，它就会等待你的再次输入

user: user-1
content: &op,后面是得加1,

user: user-0
content: 引用 2 楼 赵4老师的回复:#include <stdio.h>  int main() {     double d1,d2,d3;     unsigned char op,noError;      while(1) {         printf("请输入算式，如3+2等(Ctrl-C退出)：");         rewind(stdin);         if (3==scanf_s("%lf%c%lf",&d1,&op,&d2)) {             noError=1;             switch (op) {             case '+':d3=d1+d2;break;             case '-':d3=d1-d2;break;             case '*':d3=d1*d2;break;             case '/':                 if (d2!=0) {                     d3=d1/d2;                 } else {                     printf("除数不能为0！\n");                     noError=0;                 }             break;             default:                 printf("输入错误，请重新输入！\n");                 noError=0;             }             if (noError) printf("%-5.2lf%c%-5.2lf=%-5.2lf\n",d1,op,d2,d3);         } else {             printf("输入错误，请重新输入！\n");         }     }      return 0; }  看不懂（＃－.－）我是初学者一个我先去百度一下rewind是干啥的

user: user-0
content: 引用 1 楼 自信男孩的回复:scanf_s("%lf%c%lf",&d1,&op, 1, &d2); 缺少一个参数。因为%c需要指定内存大小；  输入的格式需要注意下，因为中间是%c，因此d1和d2之间只能有一个字符，多余一个字符这个结果就不一样了，建议在scanf_s下面打印一天语句把d1, op, d2打出来和你的输入对比一下 我不明白为什么输错后，进入下一次循环时，似乎没有执行scanf语句——输错了也只是这一次错了，在下一次循环时应该是重新等待输入啊

user: user-1
content: #include <stdio.h>  int main() {     double d1,d2,d3;     unsigned char op,noError;      while(1) {         printf("请输入算式，如3+2等(Ctrl-C退出)：");         rewind(stdin);         if (3==scanf_s("%lf%c%lf",&d1,&op,&d2)) {             noError=1;             switch (op) {             case '+':d3=d1+d2;break;             case '-':d3=d1-d2;break;             case '*':d3=d1*d2;break;             case '/':                 if (d2!=0) {                     d3=d1/d2;                 } else {                     printf("除数不能为0！\n");                     noError=0;                 }             break;             default:                 printf("输入错误，请重新输入！\n");                 noError=0;             }             if (noError) printf("%-5.2lf%c%-5.2lf=%-5.2lf\n",d1,op,d2,d3);         } else {             printf("输入错误，请重新输入！\n");         }     }      return 0; }

user: user-3
content: scanf_s("%lf%c%lf",&d1,&op, 1, &d2); 缺少一个参数。因为%c需要指定内存大小；  输入的格式需要注意下，因为中间是%c，因此d1和d2之间只能有一个字符，多余一个字符这个结果就不一样了，建议在scanf_s下面打印一天语句把d1, op, d2打出来和你的输入对比一下