user-0 提问: c语言新手请教关于i/o的问题

回复:
user: user-0
content: 引用 10楼赵4老师 的回复:仅供参考：#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-1
content: 引用 4 楼 hu1991514 的回复:[quote=引用 3楼自信男孩 的回复:][quote=引用 2 楼 hu1991514 的回复:] [quote=引用 1楼自信男孩 的回复:]输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）[/quote] 你可以查一下getchar();的返回值； 另外，getchar();是获取字符，那么一个字符的范围是0~128,占一个字节，那么int类型c完全可以存放了。[/quote]存肯定是能存呀！但是c是整形变量，getchar获取的是char型！类型不匹配呀！望指点！[/quote] 看一下getchar()的返回值，getchar()返回的是字符，用int类型类型会提升

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

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-0
content: 引用 6楼das白 的回复:字母全是asc码 也可以看做整数  之所以用int是为了接受-1 eof 而char只是0-255我看书上说，getchar接收到的字符换转换成一个整数！是这样吗？如果接收到的是浮点型都会转成整数？

user: user-3
content: 字母全是asc码 也可以看做整数  之所以用int是为了接受-1 eof 而char只是0-255

user: user-0
content: 引用 1楼自信男孩 的回复:输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；我刚刚看了下，说getchar获取一个字符返还为一个整数！我很好奇，如果获取的是一个char型的字母a，怎么会返回整数呢

user: user-0
content: 引用 3楼自信男孩 的回复:[quote=引用 2 楼 hu1991514 的回复:] [quote=引用 1楼自信男孩 的回复:]输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）[/quote] 你可以查一下getchar();的返回值； 另外，getchar();是获取字符，那么一个字符的范围是0~128,占一个字节，那么int类型c完全可以存放了。[/quote]存肯定是能存呀！但是c是整形变量，getchar获取的是char型！类型不匹配呀！望指点！

user: user-1
content: 引用 2 楼 hu1991514 的回复:[quote=引用 1楼自信男孩 的回复:]输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）[/quote] 你可以查一下getchar();的返回值； 另外，getchar();是获取字符，那么一个字符的范围是0~128,占一个字节，那么int类型c完全可以存放了。

user: user-0
content: 引用 1楼自信男孩 的回复:输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）

user: user-1
content: 输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；