C语言scanf()函数连续输入
发布时间:2023-05-11 08:57:42 所属栏目:语言 来源:
导读:在本节第一段示例代码中,我们一个一个地输入变量 a、b、c、d 的值,每输入一个值就按一次回车键。现在我们改变输入方式,将四个变量的值一次性输入,如下所示:
12 60 10 23↙
a+b=72
c*d=230
可以发现,两个
12 60 10 23↙
a+b=72
c*d=230
可以发现,两个
在本节第一段示例代码中,我们一个一个地输入变量 a、b、c、d 的值,每输入一个值就按一次回车键。现在我们改变输入方式,将四个变量的值一次性输入,如下所示: 12 60 10 23↙ a+b=72 c*d=230 可以发现,两个 scanf() 都能正确读取。合情合理的猜测是,第一个 scanf() 读取完毕后没有抛弃多余的值,而是将它们保存在了某个地方,下次接着使用。 如果我们多输入一个整数,会怎样呢? 12 60 10 23 99↙ a+b=72 c*d=230 这次我们多输入了一个 99,发现 scanf() 仍然能够正确读取,只是 99 没用罢了。 如果我们少输入一个整数,又会怎样呢? 12 60 10↙ a+b=72 23↙ c*d=230 输入三个整数后,前两个 scanf() 把前两个整数给读取了,剩下一个整数 10,而第三个 scanf() 要求输入两个整数,一个单独的 10 并不能满足要求,所以我们还得继续输入,凑够两个整数以后,第三个 scanf() 才能读取完毕。 注意,如果缓冲区中的数据不符合 scanf() 的要求,要么继续等待用户输入,要么就干脆读取失败,上面我们演示了“继续等待用户输入”的情形,下面我们对代码稍作修改,演示“读取失败”的情形。 #include <stdio.h> int main() { int a = 1, b = 2, c = 3, d = 4; //修改处:给变量赋予不同的初始值 scanf("%d", &a); scanf("%d", &b); printf("a=%d, b=%d\n", a, b); scanf("%d %d", &c, &d); printf("c=%d, d=%d\n", c, d); return 0; } 运行结果: 12 60 a10↙ a=12, b=60 c=3, d=4 前两个整数被正确读取后,剩下了 a10,而第三个 scanf() 要求输入两个十进制的整数,a10 无论如何也不符合要求,所以只能读取失败。输出结果也证明了这一点,c 和 d 的值并没有被改变。 这说明 scanf() 不会跳过不符合要求的数据,遇到不符合要求的数据会读取失败,而不是再继续等待用户输入。 总而言之,正是由于缓冲区的存在,才使得我们能够多输入一些数据,或者一次性输入所有数据,这可以认为是缓冲区的一点优势。然而,缓冲区也带来了一定的负面影响,甚至会导致很奇怪的行为,请看下面的代码: #include <stdio.h> int main() { int a = 1, b = 2; scanf("a=%d", &a); scanf("b=%d", &b); printf("a=%d, b=%d\n", a, b); return 0; } 输入示例: a=99↙ a=99, b=2 输入a=99,按下回车键,程序竟然运行结束了,只有第一个 scanf() 成功读取了数据,第二个 scanf() 仿佛没有执行一样,根本没有给用户任何机会去输入数据。 如果我们换一种输入方式呢? a=99b=200↙ a=99, b=200 这样 a 和 b 都能够正确读取了。注意,a=99b=200中间是没有任何空格的。 肯定有好奇的小伙伴又问了,如果a=99b=200两个数据之间有空格又会怎么样呢?我们不妨亲试一下: a=99 b=200↙ a=99, b=2 要想破解 scanf() 输入的问题,一定要学习缓冲区,它能使你对输入输出的认识上升到一个更高的层次,以后不管遇到什么疑难杂症,都能迎刃而解。可以说,输入输出的“命门”就在于缓冲区。 输入其它数据 除了输入整数,scanf() 还可以输入单个字符、字符串、小数等,请看下面的演示: #include <stdio.h> int main() { char letter; int age; char url[30]; float price; scanf("%c", &letter); scanf("%d", &age); scanf("%s", url); //可以加&也可以不加& scanf("%f", &price); printf("26个英文字母的最后一个是 %c。\n", letter); printf("C语言中文网已经成立%d年了,网址是 %s,开通VIP会员的价格是%g。\n", age, url, price); return 0; } 运行示例: z↙ 6↙ http://c.biancheng.net↙ 159.9↙ 26个英文字母的最后一个是 z。 C语言中文网已经成立6年了,网址是 http://c.biancheng.net,开通VIP会员的价格是159.9。 scanf() 和 printf() 虽然功能相反,但是格式控制符是一样的,单个字符、整数、小数、字符串对应的格式控制符分别是 %c、%d、%f、%s。 对读取字符串的说明 在《在C语言中使用英文字符》一节中,我们谈到了字符串的两种定义形式,它们分别是: char str1[] = "http://c.biancheng.net"; char *str2 = "C语言中文网"; 这两种形式其实是有区别的,第一种形式的字符串所在的内存既有读取权限又有写入权限,第二种形式的字符串所在的内存只有读取权限,没有写入权限。printf()、puts() 等字符串输出函数只要求字符串有读取权限,而 scanf()、gets() 等字符串输入函数要求字符串有写入权限,所以,第一种形式的字符串既可以用于输出函数又可以用于输入函数,而第二种形式的字符串只能用于输出函数。 最后需要注意的一点是,scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串,请看下面的例子: #include <stdio.h> int main() { char author[30], lang[30], url[30]; scanf("%s %s", author, lang); printf("author:%s \nlang: %s\n", author, lang); scanf("%s", url); printf("url: %s\n", url); return 0; } 运行示例: YanChangSheng C-Language↙ author:YanChangSheng lang: C-Language http://c.biancheng.net http://biancheng.net↙ url: http://c.biancheng.net 对于第一个 scanf(),它将空格前边的字符串赋值给 author,将空格后边的字符串赋值给 lang;很显然,第一个字符串遇到空格就结束了,第二个字符串到了本行的末尾结束了。 或许第二个 scanf() 更能说明问题,我们输入了两个网址,但是 scanf() 只读取了一个,就是因为这两个网址以空格为分隔,scanf() 遇到空格就认为字符串结束了,不再继续读取了。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |