C语言 printf()&scanf()

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:可显示floatdouble类型的值

    %a,%A:    十六进制表示浮点数

    %e,%E:    指数计数法表示浮点数,12.e2412.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);

这是用正则表达来控制输入格式为非空格非换行。

欢迎指正!

猜你喜欢

转载自blog.csdn.net/yanxu_165319/article/details/80957638