1 scanf() getchar()
1 #include <stdio.h> 2 int main() 3 { 4 char ch1, ch2; 5 scanf("%c", &ch1); 6 scanf("%c", &ch2); 7 printf("%d %d ", ch1, ch2); 8 return 0; 9 } 10 11 12 #include <stdio.h> 13 int main() 14 { 15 char ch1, ch2; 16 ch1 = getchar(); 17 ch2 = getchar(); 18 printf("%d %d ", ch1, ch2); 19 return 0; 20 }
函数1
这两个程序的运行效果是一样的,比如我输入1个1,就直接给我说出 49 10,根本没有等我输入第二个字符。
原因:scanf 和getchar会把回车当做一个字符给读出来 而10正好就是回车的asc码
改进方法:
#include <stdio.h> int main() { char ch1, ch2; scanf("%c", &ch1); while(getchar()!=' ');//清空输入缓存区 scanf("%c", &ch2); printf("%d %d ", ch1, ch2); return 0; } #include <stdio.h> int main() { char ch1, ch2; ch1 = getchar(); while(getchar()!=' '); ch2 = getchar(); printf("%d %d ", ch1, ch2); return 0; }
函数2
改进后就可以正常的输入2个字符,然后打印出他们的asc码
再来讨论下scanf 和getchar
还是函数1 当我们输入几个空格,然后输入1个1,最后按回车后,打印出来的是2个32 (scanf 和getchar 相同)
再来试一试函数2 当我们从键盘输入几个空格 然后输入1个1,然后按回车,接着再输入1个2 再按回车 最后输入1个32 1个50
总结,我们从键盘上输入是以回车结束的,而scanf或者是getchar从输入缓存区中读取,是以回车 空格 tab键结束的。
接下来来看看scanf和gets 输入字符串
1 #include <stdio.h> 2 3 int main() 4 { 5 char str1[20], str2[20]; 6 scanf("%s",str1); 7 printf("%s ",str1); 8 scanf("%s",str2); 9 printf("%s ",str2); 10 return 0; 11 } 12 13 程序3
测试运行:1 当我们输入123 然后在输入几个空格个数随意 再输入1个12 最后按回车
结果就直接输出123 和12 了
2 当我们输入123,然后输入几个tab键(个数随意) 再输入1个12 最后按回车
结果就直接输入123 和12 了
总结1:scanf遇到空格或者是tab键就结束输入了,即空格或者是tab后面的东西他是读不到的
2:scanf每次读取数据都会忽略掉开头的空格和tab
还是程序3 当我们输入123,按回车,他就直接输出12 再输入12,回车,他就输出12
总结:scanf遇到回车就直接结束了,上面的程序执行了2次从键盘读入字符串,说明第一次从键盘读入的回车符被丢弃了,
即scanf读取字符串后丢弃最后的回车符。
接下来说说gets
显然当要输入的字符串带空格或者是tab键时,用scanf是不合适的,这时我们就要使用gets
1 int main() 2 { 3 char str1[20], str2[20]; 4 gets(str1); 5 printf("%s ",str1); 6 gets(str2); 7 printf("%s ",str2); 8 return 0; 9 } 10 11 程序4
测试:
Hello world! [输入]
Hello world! [输出]
12345 [输入]
12345 [输出]
最后,来说说printf和puts的区别
1 int main() 2 { 3 char str1[20], str2[20]; 4 scanf("%s",str1); 5 printf("%s",str1); 6 scanf("%s",str2); 7 printf("%s",str2); 8 return 0; 9 } 10 11 测试1 12 13 14 int main() 15 { 16 char str1[20], str2[20]; 17 scanf("%s",str1); 18 printf("%s ",str1); 19 scanf("%s",str2); 20 printf("%s ",str2); 21 return 0; 22 } 23 测试2 24 25 26 int main() 27 { 28 char str1[20], str2[20]; 29 scanf("%s",str1); 30 puts(str1); 31 scanf("%s",str2); 32 puts(str2); 33 return 0; 34 } 35 测试3
当先输入12 qw 然后就输出12 qw
再输入ww dc 输出 ww dc
两者遇到空格,tab都不会停下来 都是以 ' ' 作为结束的
唯一的区别是puts会自动换行,而使用printf如果想换行必须加上换行符 ' '
结束