C语言的printf和scanf

目录

1.标准文件

2.printf

2.1基本用法

2.2占位符

2.3输出格式

2.3.1 限定宽度

2.3.2总是显⽰正负号

2.3.3限定⼩数位数

2.3.4输出部分字符串

2.4返回值

3.scanf

3.1基本用法

3.2返回值

3.3占位符

3.4赋值忽略符


1.标准文件

        C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。C语言的printf和scanf_第1张图片

C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数。

scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕)。

2.printf

2.1基本用法

1.  printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。

2.printf() 不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换 ⾏。 为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 如:

#include 
int main(void) 
{
 printf("Hello World\n");
 return 0;
}
如果⽂本内部有换⾏,也是通过插⼊换⾏符来实现,如:
#include 
int main(void) 
{
 printf("Hello\nWorld\n");
 
 printf("Hello\n");
 printf("World\n");
 return 0;
}

3.printf() 是在标准库的头⽂件 stdio.h 定义的。使⽤这个函数之前,必须在源码⽂件头部引⼊这个头⽂件。

2.2占位符

printf() 可以在输出⽂本中指定占位符。所谓 “占位符”,就是这个位置可以⽤其他值代⼊,下面是一些占位符

C语言的printf和scanf_第2张图片

(对于这些占位符,我们要记住常见的几种,不需要全部记忆)
#include 
int main()
{
   char ch = 'A';
   char str[20] = "abcdef";
   float flt = 10.234;
   int no = 150;
   double dbl = 20.123456;
   printf("字符为 %c\n", ch);
   printf("字符串为 %s\n" , str);
   printf("浮点数为 %f\n", flt);
   printf("整数为 %d\n" , no);
   printf("双精度值为 %lf \n", dbl);
   return 0;
}

以上是一些常见的打印输出类型,这些大家是要掌握的

注意:printf ()中参数与占位符的关系是一一对应的,如果有 n 个占位符, printf () 的参数就应该有 n + 1 个,因为前面格式化字符串也算一个参数。 如果参数个数少于对应的占位符, printf () 可能会输出内存中的任意值

2.3输出格式

2.3.1 限定宽度

printf() 允许限定占位符的最⼩宽度。
#include 
int main()
{
 printf("%5d\n", 123); // 输出为 " 123"
 return 0;
}
上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成 左对⻬ ,在输出内容后⾯添 加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号
对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度,
#include 
int main()
{
 printf("%12f\n", 123.45);// 输出 " 123.450000
 return 0;
}
上⾯⽰例中, %12f 表⽰输出的浮点数最少要占据12位。由于 ⼩数的默认显⽰精度是⼩数点后6位 ,所以 123.45 输出结果的头部会添加2个空格。

2.3.2总是显⽰正负号

        默认情况下, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 +

#include 
int main()
{
 printf("%+d\n", 12); // 输出 +12
 printf("%+d\n", -12); // 输出 -12
 return 0;
}

2.3.3限定⼩数位数

     在输出⼩数时,有时会希望限定⼩数的位数。比如说,希望⼩数点后⾯只保留两位小数,这时,占位符就可以写成 %.2f
#include 
int main()
{
 printf("Number is %.2f\n", 0.5);//输出Number is 0.50
 return 0;
}
这种写法可以与限定宽度占位符,结合使⽤。

2.3.4输出部分字符串

%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出的⻓度,其中 [m] 代表⼀个数字,表⽰所要输出的⻓度。

2.4返回值

        printf函数的返回值类型int(在进行嵌套使用时,其打印格式是%d),返回的是打印字符个数。

#include 
int main()
{
     printf("%d",printf("%d",43);//输出 432
     return 0;
}

 这里涉及到了函数的嵌套调用的有关知识,当程序执行最外层的printf的时候,其打印内容是printf("%d",43)的返回值,而在最外层printf函数得到printf("%d",43)的返回值之前,会先执行printf("%d",43),也就是会先打印 43,43共2个字符,所以printf("%d",43)返回整型2

3.scanf

3.1基本用法

1.scanf() 函数⽤于读取⽤⼾的键盘输⼊。 当 程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。 ⽤⼾输⼊数据、按下回⻋键后, scanf() 就会处理⽤⼾的输⼊,将其存⼊变量。 它的原型定义在头⽂件 stdio.h 。 其语法跟 printf() 类似。
2. C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数 据。
它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个变量。
3. 注意:变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,
即将变量 i 的地址指向⽤⼾输⼊的值。如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。
scanf("%d", &i);

4.scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。另外,⽤⼾使⽤回⻋键,将输⼊分成⼏⾏,也不影响解读。

C语言的printf和scanf_第3张图片

 scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读 取到 -13 停下来,因为后⾯的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 。 第⼆次调⽤ scanf() 时,就会从上⼀次停⽌解读的地⽅,继续往下读取。这⼀次读取的⾸字符是 由于对应的占位符是 %f ,会读取到 .45e12 ,这是采⽤科学计数法的浮点数格式。后⾯的# 不属于浮点数的有效字符,所以会停在这⾥。

3.2返回值

3.2.1介绍     

 scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量 EOF。(EOF=-1) 
如:
1.正常输入
C语言的printf和scanf_第4张图片
2. 如果输⼊2个数后,按 ctrl+z ,提前结束输⼊: C语言的printf和scanf_第5张图片
在VS环境中按3次 ctrl+z ,才结束了输⼊,我们可以看到r是2,表⽰正确读取了2个数值。
如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF
C语言的printf和scanf_第6张图片

3.2.2应用

scanf的返回值在我们做题时遇到了多组输入的情况时会用到,下面将会通过一个例子来告诉大家这个知识点是如何使用的。

题目:

描述:

据说智商140以上者称为天才,KiKi想知道他自己是不是天才,请帮他编程判断。输入一个整数表示一个人的智商,如果大于等于140,则表明他是一个天才,输出“Genius”。

输入描述:

多组输入,每行输入包括一个整数表示的智商。

输出描述:

针对每行输入,输出“Genius”。

示例

输入:160    输出:Genius

代码:

#include 

int main()
 {
    int a=0;
    while (scanf("%d", &a) != EOF) //或while (scanf("%d", &a) == 1)
    {
        if(a>=140)
        {printf("Genius\n");
        }

    }
    return 0;
}

在上方的代码中使用了while循环和scanf的返回值实现了多组输入,同时要是代码能够成功运行scanf的返回值应与输入数据的个数相同或者不为EOF(-1).

3.3占位符

scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。
%c :字符。
%d :整数。
%f float 类型浮点数。
%lf double 类型浮点数。
%Lf long double 类型浮点数。
%s :字符串。
%[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停⽌。
注意:
1.上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符 %c 不忽略空⽩字符 ,总是返回当前第⼀个字符,⽆论该字符是否为空格。 如果要强制跳过字符前的空⽩字符,可以写成 scanf("  %c", &ch) ,即 %c 前加上⼀个空格 ,表⽰跳过零个或多个空⽩字符。
2.占位符 %s 其实不能简单地等同于字符串。它的规则是, 从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
3.scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以, 应该 指定读⼊字符串的最⻓⻓度
 如:
#include 
int main()
{
 char name[11];
 scanf("%10s", name);
 return 0;
}
上⾯⽰例中, name 是⼀个⻓度为11的字符数组, scanf() 的占位符 %10s 表⽰最多读取⽤⼾输⼊
的10个字符,后⾯的字符将被丢弃,这样就不会有数组溢出的⻛险了。

3.4赋值忽略符

有时,输⼊可能不符合预定的格式。

scanf("%d-%d-%d", &year, &month, &day);
如果输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。如果输⼊其他格式,⽐如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) *
只要 把 * 加在任何占位符的百分号后⾯ ,该占位符就不会返回值,解析后将被丢弃。
​​​​​​​如:
scanf("%d%*c%d%*c%d", &year, &month, &day);
%*c 就是在占位符 的百分号后⾯,加⼊了赋值忽略符 * ,表⽰这个占位符没有对应的变量,解读后不必返回
关于printf和scanf的有关知识就介绍到这里了,希望能帮到大家!!!
​​​​​​​

你可能感兴趣的:(C语言学习,c语言,学习,c#,开发语言)