今天非常的突发气象的在acm上面做了一下题目,悲剧的是多年不用c的人忘记了怎么样的使用scanf了,今天还学到了一点东西。
题目里面提示了输入两个数,规定第1~6列是第一个数的范围,第8~9列是第二个数的范围。然后第一个数字可能没有6位,而第二个数字可能没有两位,那么连个数字中间可能出现,多个空格,而我们一般的使用scanf的方式对于其参数的规定是"%d %d"中间加空格的方式来得到数据的,比如说scanf("%d %d", &x, &y);而这种方式获得的数据规定了scanf的数据的结束的方式,看到空格就结束,而对于上面的两个数据,中间的空格可能很多,当第一个数据获得了以后,第二个数据获取的时候,可能在数据前有空格,而这个给%d的话会由于出错而结束。
而对于scanf函数的方式,获取内容有一个特点,对于scanf("%d%d",&x,&y),中间没有规定结束的符号的时候,scanf是根据自己的方式来结束的,那么这几种方式是
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
因此,对于中间空格很多的时候,第一个数直接赋值给了x,然后遇到空格,说明没有数据,直到遇到第二个数据的时候进行赋值,然后就遇到了回车
结束了。这对与%s 也是对的.
实例1
1 #include <stdio.h>
2 #include <math.h>
3 #include <stdlib.h>
4 #include <malloc.h>
5 #include <string.h>
6 int main(int argc, char argv[])
7 {
8 char *r;
9 int n;
10 r = (char *)malloc(1024*sizeof(char));
11 memset(r, '\0', 1024);
12 if(scanf("%s%d", r, &n) != 2)return 0;
13 printf("%s,%d\r\n", r, n);
14 return 0;
15 }
2 #include <math.h>
3 #include <stdlib.h>
4 #include <malloc.h>
5 #include <string.h>
6 int main(int argc, char argv[])
7 {
8 char *r;
9 int n;
10 r = (char *)malloc(1024*sizeof(char));
11 memset(r, '\0', 1024);
12 if(scanf("%s%d", r, &n) != 2)return 0;
13 printf("%s,%d\r\n", r, n);
14 return 0;
15 }
输入数据是
95.123 12或者是95.123 12等等中间无论多少空格的时候
得到的结果是
95.123,12