入门c语言DAY4.1——scanf&printf详细介绍

今天来对scanf与printf做一个补充讲解,因为这两个函数在C语言中还是非常重要的。

(本文有点长,请耐心食用...)

1.printf

printf从学C语言一开始就在接触了,从"Hello World"就开始了,相信大家早已不陌生。

但我还是来细细讲一下相关内容。

printf( )的作用是将参数文本输出在屏幕上,它的名字里的f代表format(格式化),表示可以定制输出文本的格式。

就拿最基本的Hello World来说

需要如下代码:

#include <stdio.h>
int main()
{
    printf("Hello World");
    return 0;
}

printf( )不会在行尾自动换行,运行结束以后就会停在Hello World后面而非下一行。

如果想换行的话,需要在Hello World后加上转义字符\n

当然,如果想让Hello World在两行上,也就是文本内部的换行,直接将换行符插入文本内部即可

比如 :Hello\nWorld\n,看着有点别扭。。

也可以这么写:

printf("Hello\n")

printf("World\n")

看起来舒服一点,其实这两种方式写出来的都是一样的结果。

还有一点要注意的是,printf作为库函数,直接使用是会报错的。需要调用包含这个库函数的头文件才可以正常使用。

这也是为什么代码开头要写上#include <stdio.h>

这个stdio.h就是printf的头文件。

有了这个以后才能正常使用printf

还有包括如何调节运行结果过快而显示不清的办法,具体操作详见我的文章:https://blog.csdn.net/2401_85895002/article/details/139907853?spm=1001.2014.3001.5501

另外,printf( )在文本输出中可以指定占位符

占位符,就是指这个位置可以用其他值代入。

C语言中常用占位符有:

%d------整型       %f------浮点数          %lf------高精度浮点数(比较特殊)

%s------字符串    %c------字符             %p------指针

%e------科学计数法     %g------小数或科学计数法

更多占位符放在后面讲。

比如这个例子:

#include <stdio.h>
int main()
{
    printf("There are %d apples\n",3);
    return 0;
}

输出的结果是There are 3 apples,这里的%d被3取代了,这就是占位符的用法。

但是对应的占位符只能对应相应类型的字符or数字等

占位符最大的特点就是占位符的第一个符号为%

输出的文本里可以使用多个占位符。

如果有n个占位符,那么printf()的参数就有n+1个,如果参数少于对应的占位符,printf()可能会输出内存中的任意值。

占位符合集:

• %a :十六进制浮点数,字母输出为小写。

• %A :十六进制浮点数,字母输出为大写。

• %c :字符。

• %d :十进制整数。//int

• %e :使用科学计数法的浮点数,指数部分的e为小写。

• %E :使用科学计数法的浮点数,指数部分的E为大写。

• %i :整数,基本等同于 %d 。

• %f :小数(包含 float 类型和 double 类型)。//float %f double - %lf

• %g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的 e 为小写。

• %G :等同于 %g ,唯一的区别是指数部分的E为大写。

• %hd :十进制 short int 类型。

• %ho :八进制 short int 类型。

• %hx :十六进制 short int 类型。

• %hu :unsigned short int 类型。

• %ld :十进制 long int 类型。

• %lo :八进制 long int 类型。

• %lx :十六进制 long int 类型。

• %lu :unsigned long int 类型。

• %lld :十进制 long long int 类型。

• %llo :十进制 long long int 类型。

• %llx :十六进制 long long int 类型。

• %llu :unsigned long long int 类型。

• %Le :科学计数法表示的 long double 类型浮点数。

• %Lf :long double 类型浮点数。 

• %n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。

• %o :八进制整数。

• %p :指针(用来打印地址)。

• %s :字符串。

• %u :无符号整数(unsigned int)。

• %x :十六进制整数。

• %zd : size_t 类型。

• %% :输出一个百分号。

printf( )可以定制占位符的输出格式。

printf( )允许限定占位符的最小宽度。

比如这个例子:

#include <stdio.h>
int main()
{
    printf("%5d\n",123);
    return 0;
}

其中%5d表示这个占位符的宽度至少为5位。

如果不满5位,对应的值的前面会添加空格。

输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空 格,可以在占位符的 % 的后面插入一个"-"号。

所以这个例子输出的结果是"  123"

如果改为%-5d,输出的结果是"123  "  

对于小数(默认显示精度为小数点后六位),这个限定符会限制所有数字的最小显示宽度。

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

printf()限定小数位数,输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成%.2f 

也可以与限制宽度占位符结合使用。

比如写作%6.2f,就是表示字符串最小宽度为6,小数位数为2

而最小宽度和小数位数这两个限定值,都可以 * 代替,通过 printf() 的参数传入。(可以类比占位符理解)

printf也可以输出部分字符串,%s 占位符用来输出字符串(默认是全部输出)

如果只想输出开头的部分,可以用 %.[m]s 指定输出的长度,其中 [m] 代表一个数字,表示所要输出的长度。

比如这个例子中,最后输出的是前五个字符,也就是“hello”

#include <stdio.h>
int main()
{
 printf("%.5s\n", "hello world");
 return 0;
}

2.scanf

printf用于输出值,而scanf用于给变量输入值。

比如在如下例子中:

#include <stdio.h>
int main()
{
 int score = 0;
 printf("请输入成绩:");
 scanf("%d", &score);
 printf("成绩是:%d\n", score);
 return 0;
}

运行后先是显示:“请输入成绩:”

需要我们自己输入一个数,才会接着输出“成绩是..”

scanf( )函数用于读取用户的键盘输入。

程序运行到这个语句时,会停下来。等待用户从键盘输入。 用户输入数据、按下回车键后, scanf( )就会处理用户的输入,将其存入变量。

而scanf的头文件和printf一样,都是stdio.h

scanf( )的语法跟printf( )类似。

写作:scanf("%d", &i);

它的第一个参数是一个格式字符串,里面会放置占位符(与printf( )的占位符基本一致)。格式字符串里面有多少个占位符,就有多少个变量。

因为C语言的数据都是有类型的, 所以scanf( )必须提前知道用户输入的数据类型,才能处理数 据。

注意:变量前面必须加上 & 运算符(指针变量除外),因为 scanf( )传递的不是值,而是地址, 即将变量 i 的地址指向用户输入的值。

如果这里的变量是指针变量(如字符串变量),那就不用加&运算符。

scanf( )处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。所以,用户输入的数据之间,有一个或多个空格不影响scanf( )解读数据。另外,使用回车键分成几行,也不影响解读。

scanf( )处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存 进行解读。

比如这个例子:

#include <stdio.h>
int main()
{
 int x;
 float y;

 // 用户输入 " -13.45e12# 0"
 scanf("%d", &x);
 printf("%d\n", x);
 scanf("%f", &y);
 printf("%f\n", y);
 return 0;
}

第一次,scanf( )读取用户输入时, %d占位符会忽略起首的空格,从 - 处开始获取数据,读取到 -13 停下来,因为后面的 . 不属于整数的有效字符。也就是说,占位符 %d 会读到 -13 。

第二次,会从上一次停止解读的地方,继续往下读取。所以读取的是.45e12,由于#不属于浮点数的有效字符,所以到此为止

scanf( )的返回值是一个整数,表示成功读取的变量个数。

如果没有读取任何项,或者匹配失败,则返回0 。

如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)( EOF - end of file 文件结束标志)

scanf( )的常用占位符与printf( )的占位符基本一致

%d   %f     %lf     %Lf     %s     %[]都会自动忽略起首的空白字符。

%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。

写成 scanf(" %c", &ch),可强制跳过字符前的空白字符,即%c前加上个空格,表示跳过零个或多个空白字符。

占位符%s其实不能简单地等同于字符串。它的规则是,从当前第一个空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。

也就是说scanf( )不适合读取可能包含空格的字符串,如书名或歌名等

scanf( )读取字符串时,不会检测字符串是否超过了数组长度。所以,储存字符串时, 很可能会超过数组的边界,造成不可知的后果。为了防止这种情况,使用%s占位符时,应该指定读区字符串的最大长度,即写成%[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,最大长度以外的余下内容就会被丢弃,避免超出数组边界的情况出现。

scanf( )还提供了一个赋值忽略符 * 。 只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。主要就是因为用户的输入可能不符合预定的格式,导致scanf( )解析数据失败,而使用赋值忽略符可以忽略解析错误的情况,直接继续向后读取,不会再返回报错等情况。

以上就是今天关于printf和scanf的补充内容。。

相关推荐

  1. 入门c语言DAY4.1——scanf&printf详细介绍

    2024-07-18 02:04:04       27 阅读
  2. c++语句详细介绍

    2024-07-18 02:04:04       36 阅读
  3. C语言精选——选择题Day40

    2024-07-18 02:04:04       56 阅读
  4. C语言—每日选择题—Day48

    2024-07-18 02:04:04       51 阅读
  5. C语言—每日选择题—Day49

    2024-07-18 02:04:04       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 02:04:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 02:04:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 02:04:04       62 阅读
  4. Python语言-面向对象

    2024-07-18 02:04:04       72 阅读

热门阅读

  1. 【C#】Array和List

    2024-07-18 02:04:04       24 阅读
  2. qt设置窗口位置设置

    2024-07-18 02:04:04       22 阅读
  3. bs4取值技巧的详细介绍

    2024-07-18 02:04:04       23 阅读
  4. Llama - Prompting

    2024-07-18 02:04:04       22 阅读
  5. 【SASS/SCSS(二)】模块化语法

    2024-07-18 02:04:04       27 阅读
  6. HTML5应用的安全防护策略与实践

    2024-07-18 02:04:04       22 阅读
  7. 23种设计模式

    2024-07-18 02:04:04       20 阅读
  8. tomcat如何进行调优?

    2024-07-18 02:04:04       17 阅读
  9. C#调用非托管dll的两种方式

    2024-07-18 02:04:04       22 阅读
  10. WEB渗透之相关概念(笔记)

    2024-07-18 02:04:04       24 阅读