C语言——printf与scanf详解(返回值,占位符)

先提介绍

1,printf与scanf都是c语言中常用的函数,printf用于格式化输出数据到标准输出设备(通常是终端或命令行窗口)。也就是俗称的打印。

2,scanf用于从标准输入设备(通常是终端或命令行窗口)读取格式化数据。也就是输入数据。

3,很多初学者都只会用printf进行打印输出,用scanf用于读取数据,而不知道其实它们是有返回值的,只不过用的不是很多,但是却有时候很好用,这里来详细介绍一下。

占位符

(红色的比较常用)

  • %d:用于输出或输入带符号的十进制整数。

  • %u:用于输出或输入无符号的十进制整数。

  • %f:用于输出或输入带小数的浮点数。

  • %lf:用于double类型

  • %c:用于输出或输入单个字符。

  • %s:用于输出或输入字符串(字符数组)。

  • %p:用于输出或输入内存地址。

  • %x:用于输出或输入十六进制整数。

  • %e:用科学计数法输出浮点数。

  • %o:以八进制形式输出整数。

  • %b:以二进制形式输出整数(部分编译器可能不支持)。

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

      输出一个%比较特殊,特殊记
    

特殊字符

  • \n:换行符,用于在输出文本中创建新的一行。
  • \t:制表符,用于在输出文本中创建水平制表位(通常相当于四个空格)。
  • \r:回车符,用于将光标移到当前行的开头位置。
  • \b:退格符,用于将光标向后移动一个位置,可以用于删除前一个字符。
  • \:反斜杠,用于在字符串中插入一个反斜杠字符。
  • ':单引号,用于在字符串中插入一个单引号字符。
  • ":双引号,用于在字符串中插入一个双引号字符。

printf()函数

基本内容

1,功能:用于格式化输出数据到标准输出设备(通常是终端或命令行窗口)。

2,头文件:#include<stdio.h>
声明:int printf(const char *format, …);

3,参数:format为控制输出格式的字符串,后面的可变参数根据格式字符串中的占位符进行替换。

4,返回值:成功输出字符数,若发生错误则返回负值。(换行符也算一个字符)

实例

  • 举个例子看看:
int main(void) {
    int m = 0, n = 0;
    float j = 0.1;
    
    int res1 = printf("%d %d\n", m); // 第一个格式化字符串有两个占位符,但只提供了一个参数m
    int res2 = printf("%d\n", j);    // 将浮点数j以%d格式输出,会导致未定义的行为
    int res3 = printf("%d\n", n);    // 输出整数n的值为0
    
    printf("%d %d %d", res1, res2, res3); // 输出res1、res2和res3的值
    
    return 0;
}
  • 结果(编译器不同结果可能不同):

请添加图片描述

  • 解释:

1,int res1 = printf(“%d %d\n”, m);

这里的格式化字符串"%d %d\n"包含了两个占位符,但是只提供了一个参数m。
因此,该printf语句会产生一个未定义的行为,可能会输出无效数据。
在某些编译器上,可能会将未提供的第二个参数视为随机值,或者根本不输出任何内容。结果无法确定。
———————————————————————————
2,int res2 = printf(“%d\n”, j);

格式化字符串"%d\n"要求输出整数,但参数j是一个浮点数。
这种不匹配的格式化会导致未定义的行为。
在某些编译器上,可能会输出一个随机的整数值,或者输出完全无效的结果。结果无法确定。
———————————————————————————
3,int res3 = printf(“%d\n”, n);

格式化字符串"%d\n"正确地匹配了一个整数占位符,并且提供了整数变量n。
由于初始化时m和n都被赋值为0,所以这里会输出整数0。
———————————————————————————
4,printf(“%d %d %d”, res1, res2, res3);

这里打印了res1、res2和res3的值,它们分别是之前三个printf语句的返回值。
由于res1和res2的值是未定义的,所以输出结果也是不确定的。

scanf()函数

基本内容

1,功能:从标准输入设备(通常是终端或命令行窗口)读取格式化数据。

2,头文件同上
声明:int scanf(const char *format, …);

3,参数:format为控制输入格式的字符串,后面的可变参数地址用于存储读取的数据。

4,返回值:成功读取的输入项数,若发生错误或到达文件末尾则返回EOF。

实例

  • 例子如下:

1,格式字符串与要读取的参数类型不匹配:如果格式字符串中的占位符与要读取的参数类型不匹配,将导致未定义的行为或读取错误的数据。

int num;
scanf("%s", num);  // 错误:尝试将字符串读取到整型变量num中

———————————————————————————
2,空指针作为参数:如果提供给scanf的参数是空指针(NULL),则会导致未定义的行为或崩溃。

char *str = NULL;
scanf("%s", str);  // 错误:尝试将输入字符串保存到空指针str中

———————————————————————————
3,输入数据类型与期望的不匹配:如果要读取的数据类型与实际输入的数据类型不匹配,会导致读取错误的数据或未定义的行为。

int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d\n", num);

// 用户输入了非数字字符,如字母或特殊符号
// 这将导致scanf无法正确读取整数值,并且num的值将保持不变

———————————————————————————
4,输入缓冲区溢出:如果要读取的数据超过了输入缓冲区的大小,会导致未定义的行为或崩溃。

char str[5];
scanf("%s", str);  // 如果输入的字符串长度超过了4个字符(包括终止符),会导致缓冲区溢出
  • 结果读者可以自行尝试

字符宽度指示器

  • 在C语言中,字段宽度指示器用于控制输出的字段的宽度。它被用于格式化输出函数(如printf)的格式字符串中,用于规定输出的字段所占的字符数。

  • 字段宽度指示器由一个数字表示,并放置在%字符和转换说明符之间。例如,"%5d"表示希望将整数以字段宽度为5的形式输出。

  • 当输出的数据不足字段宽度时,C语言会使用空格字符进行填充,使字段达到指定的宽度。如果输出的数据超过字段宽度,则会按照实际数据的长度进行输出,而忽略字段宽度指示器。

下面是一些例子来解释字段宽度指示器的使用:

printf函数

int number = 123;
printf("%5d\n", number);

输出:

123

在这个例子中,字段宽度指示器为5,所以输出的字段宽度为5。由于实际数据只有3个字符,因此在前面添加了两个空格字符,使得输出的字段达到了指定的宽度。

float value = 3.14159;
printf("%8.2f\n", value);

输出:

3.14

在这个例子中,字段宽度指示器为8,且精度为2(小数点后保留两位)。由于实际数据的长度为5个字符,所以在前面添加了3个空格字符,使得输出的字段达到了指定的宽度。

scanf函数

在scanf函数中,字符宽度指示器用于限制输入字段的最大宽度。它可以确保读取的字符串或数字不超过指定的字符数。

字符宽度指示器由一个数字放置在%字符后面,并在转换说明符之前。例如,"%5s"表示希望从输入中读取一个最大宽度为5的字符串。

下面是一些常用的字符宽度指示器的示例:

char string[10];
scanf("%9s", string);

在这个例子中,字符宽度指示器为9,所以scanf函数最多会读取9个字符(包括空字符’\0’),并将其存储到string数组中。这样做可以确保输入的字符串不会溢出数组的边界。

int number;
scanf("%3d", &number);

在这个例子中,字符宽度指示器为3,所以scanf函数只会读取最多3位数字,并将其存储到number变量中。如果输入的数字超过了3位,则只会读取前3位。

需要注意的是,字符宽度指示器只适用于字符串和整数类型的读取,对于浮点数类型的读取无效。对于浮点数类型,可以使用精度指示器来控制小数部分的位数。

精度指示器

在C语言中,精度指示器用于控制浮点数输出的小数位数。它可以确保输出的浮点数具有指定的精度。

精度指示器由一个句点(.)后面跟着一个数字表示,放置在转换说明符之前。例如,"%.2f"表示希望将浮点数以保留两位小数的形式输出。

下面是一些常用的精度指示器的示例:

float value = 3.14159;
printf("%.2f\n", value);

输出:

3.14

在这个例子中,精度指示器为2,所以输出的浮点数只包含两位小数。

double number = 123.456789;
printf("%.4lf\n", number);

输出:

123.4568

在这个例子中,精度指示器为4,所以输出的浮点数保留四位小数。注意,使用了"%lf"作为转换说明符来匹配double类型。

需要注意的是,精度指示器只适用于浮点数类型的输出,对于整数类型无效。

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值