关于C中scanf对包含字符串的不同类型数据输入的笔记

本文深入探讨了C语言中scanf函数的使用技巧,特别是%d%d与%d,%d格式的区别,以及在输入数组和字符串时的常见陷阱。通过实例,解释了不同输入格式对变量赋值的影响,帮助读者避免常见的编程错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个较易被初学者弄晕的一个坑。

先看看scanf的相关知识,scanf的格式为:
scanf(格式控制, 地址列表)
关于格式控制,scanf允许以"%d, %d, %d"与"%d%d%d"格式,初学的时候,我们常常直接使用,却没有去深究过这两种格式有什么差别。

在C中,对于"%d%d"和"%d, %d"两种输入格式的差别:
(1)在输出方面,若这两种变量存放的值是123和456为例,即
int t1 = 123;
int t2 = 456;
①printf("%d%d", t1, t2);
②printf("%d, %d",t1, t2);
相应输出的是:
①123456
②123,456
输出的格式与printf的格式有关,与scanf 的输入格式无关。
(2)在输入方面,
1>用"%d%d"输入时,没有指定输入的间隔,这是凡是不可见字符,包括空格" “,制表符” “(tab键)或”\t",换行符(回车键)或"\n",均可作为输入的分隔。
如scanf("%d%d", &t1, &t2);输入1和2时,
可以:1\t2, 也可以:1\n2
2>用"%d, %d"输入时,限定格式必须为以逗号分隔,即当输入完第一个数后,必须紧跟一个逗号,否则输入会出错。需说明的是,此格式只限定一个数字后必须为逗号,而逗号和第二个数字之间是否存在不可见字符并没有要求。
即:123,456\n或123, 456\n都正确
但123 ,456则错误。

而一个坑在scanf在输入包含数组或者字符串时,比如此时要用一个scanf语句同时对三个变量(包括int型,char数组,int型)赋值,以分别输入“10,china,30”为例,若以
int t1;
char t2[10];
int t3;
scanf("%d, %s, %d",&t1,&t2,&t3);
printf("%d,%s,%d",t1,t2,t3);
按此格式输入为:
10,china,30
但输出为:
10,china,30,0

好好地怎么多出一个0?期初我还以为是数组未填满造成的,后来证实这并不影响。通过查阅资料与多次验证,终于发现问题出在了数组,即用这种格式时,用逗号隔开**,逗号被数组认作字符连同第三个int型变量一并读入数组内**,导致第三个变量并没有被赋值,最后导致不符合要求。

如果用"%d%s%d"格式输入,则不存在此问题。在此格式下,输入时以空格、Enter键、Tab键为分隔,使得数组与整型自行分开。即
输入:
10 china 30 或 10\nchina\n30 或 10\tchina\t30
输出为:
10,china,30

总的来讲,这是scanf的分隔符输入与数组的冲突。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值