#include <stdio.h>
void main() {
char s[100];
int c,i;
scanf("%c",&c);
scanf("%d",&i);
scanf("%s",&s);
printf("%c,%d,%s\n",c,i,s);
}
这个我输入123 123
输出:1,23,123
为什么这个第三个%s输出123
#include <stdio.h>
void main() {
char s[100];
int c,i;
scanf("%c",&c);
scanf("%d",&i);
scanf("%d",&s);
printf("%c,%d,%s\n",c,i,s);
}
而我将第三个scanf%s改为%d同样输入123 123
输出结果是:1,23,{
为什么将第三个scanf中%s改为%d,输入123 123 后面的123变成对应的Ascll码符号
第一个程序:
输入123 123,第一个scanf将 ‘1’ 识别成字符,赋给c;缓冲区里 23 123;第二个scanf读取23遇到 ‘ ’ 空白字符停止,将 23 识别成 int 赋值给 i;缓冲区里 123;第三个scanf将 “123”识别成字符串,输入给s[100]数组中。所以是输出 “123“。
第二个程序:
同理,123 识别成 int 类型,在存入 char s[100] 字符串数组中时,转换成 int 123 对应的ASCII码字符形式,所以输出 ”{“。
//为什么这个第三个%s输出123
因为接收到是字符串 (%s)所以屏幕输出的 123,其实是字符串,不是数字
Ascill码 取值范围是0~127,你输入的是123,输入到字符数组的第一个字符变量里,字符数组以%s输出的时候,刚好数组只有一个字符,所以按照123在Ascill码的对应元素输出
第二个问题,scanf("%d",&s);
相当于将 123这个整数,存在 s[0]中,当你使用 %s输出 s的时候,只有第一个元素有效,其他的是0,所以会输出 ASSIC=123的值,也就是 “{”
%d,i 以带符号的十进制形式输出整数(正数不输出符号)%i 可以以八进制 十六进制转换十进制形式 则%d不能转换,直接输出
%u 以无符号的十进制形式输出整数
%o 以八进制的无符号形式输出整数(不输出前导符0)
%x X 以十六进制无符号形式输出整数(不输出前导符0x),用小写x 则输出0f 用大写X则输出0F
%c 以字符形式输出,只输出一字符
%s 输出字符串
%f 以小数形式输出单,双精度数,隐含输出6位小数
%e E 以指数形式输出实数
%g G 选用%f 或者%e格式中输出宽度较短的一种格式
在printf 函数中用到的格式附加字符
l 长整型整数,可加在格式符d o x u前面 列如:%ld
m (代表一个正整数) 数据最小宽度
n(代表一个正整数) 对实数,表示输出 n 位小数,对字符串,表示截取的字符个数
— 输出的数字或字符在域内向左靠
在scanf 函数输入数据
%d i 输入有符号十进制数
%c 输入无符号十进制数
%o 输入无符号入进制数
%x X 输入无符号的十六进制整数(大小写作用相同)
%c 输入单个字符
%s 输入字符串 将字符串送到一个字符数组中,在输入时以非空白字符开始,结束是以第一个空白字符结束,字符串结束标志‘/0’作为其最后一个字符
%f 输入实数 可以用小数形式或者指数形式输入
%e E g G 与f作用相同,e 与f g 可以相替换(大小写作用相同)
在scanf 函数中用到的格式附加字符
l输入长整 形数据(可用%ld,%lo,%lx,%lu)double形数据%lf%le
h输入短整 形数据%hd%ho%hx
域宽 指定输入数据所占宽度(列数)