scanf() 和 printf() 函数
int scanf(const char *format, ...) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
int printf(const char *format, ...) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。
format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据需要使用
scanf():
在读取字符串时,只要遇到一个空格,scanf() 就会停止读取,所以 "this is test" 对 scanf() 来说是三个字符串。
转换说明:
%d %i:有符号十进制整数,用%d显示float类型的值,不会转化为int类型;
%f:可显示float或double类型的值
%a,%A: 十六进制表示浮点数
%e,%E: 指数计数法表示浮点数,12.e24,12.E24。
%#o,%o:无符号八进制;前一个表示格式为014,后一个表示格式为14;
%#x,%x: 无符号十六进制,前一个表示格式为0xAA,后一个表示AA;
%#X,%X:无符号十六进制,前一个表示格式为0XAA,后一个表示AA;
%u:无符号十进制整数
%s:字符串
%p:指针
转义序列:
\t: 水平制表符
\n: 回车换行,将光标移到下一行开头
\r: 回车 ,将光标移到本行开头
\b: 退格
printf() 和 scanf():
printf()和scanf()用第一个参数表明后续有多少个参数,即第一个字符串中的转换说明与后面的参数一一对应;C语言通过函数原型机制检查函数调用时参数的个数和类型是否正确,但是,该机制对printf()和scanf()不起作用,因为这两个函数的参数个数可变。
printf():
printf()语句可以分为两行,只要不在引号中间或者一个单词中间断行就可以。
读取字符的疑问:
int i;
char c;
scanf("%d%c", &i,&c);
如果我们输入是(ab),,中间没有空格的话,就会正常输入。
但是如果我们添加空格就会与输入格式不符,实际上缓存区内会存在三个字符(a_b),所以导致我们第二个读的是空格
然后我们又会这样来写:
int i;
char c;
scanf("%d", &i);
scanf("%d", &c);
我们发现,根本没有输入字符C的机会,这是为什么?
因为输入流是有缓冲区的,我们输入完第一个字符,例如输入a;这是我们需要点击回车,scanf()才会读取字符,但是,此时缓冲区内就会存在一个回车符;导致第二字符不需要我们输入,scanf()直接读取回车符;
我们可以这样改:
int i;
char c;
scanf("%d", &i);
while((c=getchar())==' ' || c=='\n');
c = getchar();
这个办法是使用getchar() 读取回车符和换行符,建议我们每次使用scanf()后,都添加一个gatchar(),清理缓冲区
但是有一个更好的解决办法;
int i;
char c;
scanf("%d%[^' '^'\n']", &i, &c);
这是用正则表达来控制输入格式为非空格非换行。
欢迎指正!