user-0 提问: C语言遇到的3个问题，一起问了

回复:
user: user-1
content: int main(void) { 	int n1, n2; 	while(2 == scanf("%10d%10d", &n1, &n2)) 		printf("n1=%d,n2=%d\n", n1, n2); 	return 0; } //123 456 //n1=123,n2=456 //1234567890123 456 //n1=1234567890,n2=123

user: user-2
content: 排除一切干扰（非数字、任意间隔字符、超长超大输入、……），输入两个整数。

user: user-3
content: 引用#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }  这段代码是干嘛用的啊， 大哥解释一下呗

user: user-3
content: do 	{ 	  testOne = scanf("%f",&nu); 	  fflush(stdin); 	  testTwo = scanf("%f",&nj); 	  fflush(stdin); 	}while(testOne == 1 & testTwo ==1); 		  这是一个关于缓冲区 的问题，刷新输入流

user: user-4
content: 引用 1 楼 adlay 的回复:1. 你用 %f 来输入 int ？      出错的时候输入流会处于一种错误的状态，只有把这种状态清除后才能继续输入。  2. 用 set 命令可以改变变量的值 3. %f 本来就是用于输入 float 的，float 和 double 大小都不一样，用 double 会得到错误的结果的，能提供警告说明编译器做得好。  3 我看错了，以为是 scanf  在输入

user: user-5
content: 1. %处理不了字母, 处理不了就自然跳过了 2. set var kk=0 3. 什么warning

user: user-4
content: 1. 你用 %f 来输入 int ？      出错的时候输入流会处于一种错误的状态，只有把这种状态清除后才能继续输入。  2. 用 set 命令可以改变变量的值 3. %f 本来就是用于输入 float 的，float 和 double 大小都不一样，用 double 会得到错误的结果的，能提供警告说明编译器做得好。

user: user-6
content: 2楼正解！ 顶2楼的

user: user-7
content: 引用 9 楼 user-7 的回复:1.循环条件改为true，每个输入后面跟一个判断，如果是字母就break； 2.%c是输入单个字符的时候使用的，而names是个数组，你这样输入只是给names[0]进行赋值了，而后面的值由于没有初始化，strlen无法找到结束符\0，当然无法正确获取该字符串长度了。你可以试试%c换成%s。另外记得申请数组的时候初始化，如char names = { 0 };char names[20]= { 0 };个数忘写了，不好意思

user: user-7
content: 1.循环条件改为true，每个输入后面跟一个判断，如果是字母就break； 2.%c是输入单个字符的时候使用的，而names是个数组，你这样输入只是给names[0]进行赋值了，而后面的值由于没有初始化，strlen无法找到结束符\0，当然无法正确获取该字符串长度了。你可以试试%c换成%s。另外记得申请数组的时候初始化，如char names = { 0 };

user: user-4
content: 引用 5 楼 kog2333 的回复:[quote=引用 1 楼 adlay 的回复:] 1. 你用 %f 来输入 int ？      出错的时候输入流会处于一种错误的状态，只有把这种状态清除后才能继续输入。  2. 用 set 命令可以改变变量的值 3. %f 本来就是用于输入 float 的，float 和 double 大小都不一样，用 double 会得到错误的结果的，能提供警告说明编译器做得好。 额，第三个问题我没仔细看书。。。。  第一个问题是个什么情况，以前写c++代码的时候类似情况会给第二次输入的机会，所以我以为C也一样，但实际结果却是不给第二次出入的机会[/quote]  printf 的 "%f" 确实是对应 double 的 scanf 的 "%f" 才是对应 float   C++ 中的输入流也有错误状态的吧，这方面应该是相同的哦

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-0
content: 引用 1 楼 adlay 的回复:1. 你用 %f 来输入 int ？      出错的时候输入流会处于一种错误的状态，只有把这种状态清除后才能继续输入。  2. 用 set 命令可以改变变量的值 3. %f 本来就是用于输入 float 的，float 和 double 大小都不一样，用 double 会得到错误的结果的，能提供警告说明编译器做得好。 额，第三个问题我没仔细看书。。。。  第一个问题是个什么情况，以前写c++代码的时候类似情况会给第二次输入的机会，所以我以为C也一样，但实际结果却是不给第二次出入的机会

user: user-0
content: 引用 3 楼 adlay 的回复:[quote=引用 1 楼 adlay 的回复:] 1. 你用 %f 来输入 int ？      出错的时候输入流会处于一种错误的状态，只有把这种状态清除后才能继续输入。  2. 用 set 命令可以改变变量的值 3. %f 本来就是用于输入 float 的，float 和 double 大小都不一样，用 double 会得到错误的结果的，能提供警告说明编译器做得好。  3 我看错了，以为是 scanf  在输入[/quote] 我是用scanf()函数的返回值判断输入是否合格