printf和scanf和getchar的基本使用

printf

printf() 的作用表示是将参数文本输出到屏幕。它名字里面的 f 代表 format (格式化),可以
定制输出文本的格式。
printf() 是在标准库的头文件 stdio.h 定义的。使用这个函数之前,必须在源码文件头部引⼊这
个头文件。
#include <stdio.h>
int main(void) 
{
 printf("Hello World");
 return 0;
}
上面命令会在屏幕上输出一行文字“Hello World”。
printf() 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换
行。 为了让光标移到下一行的开头,可以在输出文本的结尾,添加⼀个换行符 \n

占位符

printf() 可以在输出文本中指定占位符。 所谓 “占位符”,就是这个位置可以用其他值代入。
printf("I am %d years old\n", 18);
输出结果 就是 I am 18 years old
代码中的 %d 就是占位符,代表这个位置要其他值来替换。占位符的第一个字符一律为百分号 % ,第二个字符表示占位符的类型, %d 表示 这 里代入的值必须是整数。
常用的占位符除了 %d ,还有 %s 表示 代入的是字符串。

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

C语言中常见占位符如下:
  1. %d:用于输出带符号的十进制整数。
  2. %i:与%d相同,用于输出带符号的十进制整数。
  3. %u:用于输出无符号的十进制整数。
  4. %o:用于输出无符号的八进制整数。
  5. %x:用于输出无符号的十六进制整数(使用小写字母)。
  6. %X:用于输出无符号的十六进制整数(使用大写字母)。
  7. %f:用于输出浮点数。
  8. %e:用于以科学计数法输出浮点数(小写字母e表示指数)。
  9. %E:用于以科学计数法输出浮点数(大写字母E表示指数)。
  10. %g:根据值的大小选择%f或%e格式来输出浮点数。
  11. %G:根据值的大小选择%f或%E格式来输出浮点数。
  12. %c:用于输出单个字符。
  13. %s:用于输出字符串。
  14. %p:用于输出指针的地址。
  15. %%:用于输出百分号本身。
  16. %zd size_t 类型。

输出格式

限制宽度

printf("%5d\n", 123); // 输出为 " 123"
上面示例中 %5d 表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空
格,可以在占位符的 % 的后面插入一个 - 号。
printf("%-5d\n", 123); // 输出为 "123 "
对于小数,这个限定符会限制所有数字的最小显示宽度。
printf("%12f\n", 123.45);// 输出 " 123.450000"
上面示例中 %12f 表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位, 所以 123.45 输出结果的头部会添加2个空格

总是显示正负号

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

限定小数位数

输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留位,占位符可以写
%.2f
printf("Number is %.2f\n", 0.5);// 输出 Number is 0.50

同理如果希望小数点后⾯输出3位( 0.500 ),占位符就要写成 %.3f

这种写法可以与限定宽度占位符,结合使用。
printf("%6.2f\n", 0.5);// 输出为 " 0.50"
上面示例中, %6.2f 表示 输出字符串最小宽度为6,小数位数为2。所以,输出字符串的头部有两个空格。
最小宽度和小数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。
printf("%*.*f\n", 6, 2, 0.5);

scanf

当我们有了变量,我们需要给变量输入值就可以使用 scanf 函数
但是在Visual Studio中使用scanf函数会报错,如果你使用了Visual Studio来编写代码,需要在代码最前面添加上下面语句
#define _CRT_SECURE_NO_WARNINGS 1

只有安装了VS,你的安装路径下就会有一个newc++flie.cpp这个文件,找到这个文件拷贝到桌面,用记事本打开后把这行代码直接加到他的第一行,然后再放回原先的文件夹替换掉原来的文件,以后创建新的.c或.cpp文件就会自动在第一行添加上这行代码,就不需要每次都手动添加。

scanf("%d", &i);
它的第⼀个参数是⼀个格式字符串,里面放置占位符告诉编译器如何解读用户的输⼊,需要提取的数据是什么类型。 这是因为 C 语言的数据都是有类型的, scanf() 必须提前知道用户输入的数据类型,才能处理数据。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
变量前面必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址。
scanf()也可以输入读入多个变量。
scanf("%d%d%f%f", &i, &j, &x, &y);
scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
所以在输入时数据之间有空格或分行也不影响读取。
注意:若用占位符%c读取char类型的数据,不会忽略起首的空白字符。如果要强制跳过字符前的空白字符可以在%c前加上一个空格,表示跳过零个或多个空白字符。

返回值

scanf() 的返回值是⼀个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发生了读取错误或 者遇到读取到文件结尾,则返回常量 EOF
注意:如果在读取整数时,写成了“%d ”,即在最后加上一个 空格,将会读取失败。这是由于 scanf函数在读取整数后会继续跳过空白字符,直到遇到一个非空白字符才停止。因此如果输入流中没有额外的非空白字符, scanf函数将会一直等待输入,因此你可能会认为 scanf函数读取失败了。

读取字符串

当使用%s占位符来获取数据时是从当前第一个非空白的字符读起知道遇到空白字符,包括空格、制表符、换行符为止。因此%s不能一次读取多个英文单词,也就意味着scanf()不适合读取包含空格的字符串。

当用scanf()读取字符数组时不会检测是否超出数组长度,所以很可能在存储字符串时超出数组边界,因此在用%s占位符时,要指定读入字符串的最大长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

示例如下

#include <stdio.h>
int main()
{
 char name[11];
 scanf("%10s", name);
 return 0;
}

赋值忽略符

只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。

 scanf("%d%*c%d%*c%d", &year, &month, &day);

这样子无论输入2023-7-23还是2023/7/23都能获取到正确的年、月、日了。

getchar

输入缓冲区

当你使用scanf函数读取输入时,输入缓冲区会接收所有键盘输入,包括换行符和空格符。

如果scanf在读取数字或字符串时停止(例如遇到空格或换行符),输入缓冲区中仍然会留下未读取的字符,包括这些空白符。

为什么需要getchar()

在使用scanf读取字符串后,通常需要使用getchar()来读取输入缓冲区中的剩余字符,特别是换行符\n。

如果不清除输入缓冲区中的换行符,在下一次输入操作中可能会出现意外的行为,因为换行符会被下一个输入操作误读。

示例如下

#include <stdio.h>
int main() {
    char str[100];
    // 读取一行字符串,直到换行符为止
    scanf("%[^\n]", str);
    // 清除输入缓冲区中的换行符
    getchar();
    // 再次读取一个字符,此时会读取掉上一行输入的换行符
    char ch = getchar();
    printf("Input String: %s\n", str);
    printf("Next character: %c\n", ch);
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值