输入输出函数

输入函数

scanf

scanf函数可以从标准输入(键盘)读取输入,并根据指定的格式字符串将输入转换成相应的数据类型。它的语法为:

1
2
int scanf(const char *format, ...)
// scanf函数返回成功读取的数据项个数

其中,format是一个字符串,包含了要读取的数据类型和格式信息,以及一些控制字符。…表示可变参数列表,对应format中的格式字符串,用于存储读取到的数据。

例如,下面的代码可以从键盘读取一个整数,并将其存储到变量x中:

1
scanf("%d", &x);

scanf函数的优点是可以方便地读取不同类型的数据,并且可以指定输入格式,从而保证读取的数据正确。但它的缺点是比较容易出现输入错误或格式错误,需要特别小心。

使用scanf()函数输入多个数据时,可以使用空格、制表符或换行符来分隔scanf输入的多个数据项,但是对于格式字符串中的各种格式字符,需要按照格式字符串的分隔符来分隔输入数据项。

getchar

getchar函数可以从标准输入(键盘)读取一个字符,并返回该字符的ASCII码值。它的语法为:

1
int getchar(void);  //getchar()无参数

注意:无论我们输入(回车空格都读)什么,getchar只会将其当作一个字符来处理,然后将其转换成相应的ascii码值,然后转成二进制数据,存入到变量所开辟的空间中!即使我们输入多个字符getchar也只会将接收到的首个字符将其存入到变量开辟的内存空间中。

为什么返回字符的ascil码?

我们的字符存入到变量当中时,本质上是将字符的ascii码值存入到变量所开辟的内存空间中

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的

使用getchar读取多个字符并存储在一个字符数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
char str[100];
int i = 0;
char c;

printf("请输入多个字符,以回车符结尾:");
while ((c = getchar()) != '\n' && i < 99) {
str[i] = c;
i++;
}
str[i] = '\0';

printf("您输入的多个字符是:%s\n", str);

return 0;
}

总结:getchar函数的优点是比较简单易用,可以用来读取单个字符。但它的缺点是不支持读取其他类型的数据,而且每次只能读取一个字符。

gets

gets函数可以从标准输入(键盘)读取一个字符串,并将其存储到指定的字符数组中。它的语法为:

1
char *gets(char *str);

其中,str是一个字符数组,用于存储读取到的字符串。gets函数会读取从键盘输入的字符串,并将其存储到str中,直到读取到换行符为止(换行符不会被存储在数组中,也可以理解为自动将换行转换为‘\0’)。如果读取的字符串超过了数组的大小,会导致缓冲区溢出,从而引起程序错误。

例如,下面的代码可以从键盘读取一个字符串,并输出它:

1
2
3
char str[100];
gets(str);
printf("%s\n", str);

gets函数的优点是可以方便地读取字符串,但它的缺点是不支持指定输入格式,从而可能导致读取错误或缓冲区溢出。为了避免这些问题,通常建议使用更加安全的fgets函数来代替gets函数。

输入函数总结

  1. scanf可以读取各种类型的数据,但需要指定格式字符串,并且要用&符号获取变量的地址。
  2. gets用于读取一行字符串,但容易引起缓冲区溢出的问题,不推荐使用。
  3. getchar用于读取单个字符,可用于读取多个字符并存储在字符数组中。

输出函数

printf

printf函数是最常用的输出函数之一,它的原型如下:

1
int printf(const char *format, ...);

其中,format参数是一个格式化字符串,可以包含占位符%,后面的参数是要输出的数据。printf函数会将格式化字符串中的占位符替换成相应的参数,并将结果输出到标准输出流(通常是控制台)。

printf函数可以输出各种格式的数据,如整型、浮点型、字符型、字符串等等。它也支持一些格式化选项,比如指定输出的宽度、精度等等。

putchar

putchar函数是将一个字符输出到标准输出流(通常是控制台)的函数,它的原型如下:

1
int putchar(int c);

其中,c参数是要输出的字符。putchar函数将指定的字符输出到标准输出流,并 返回输出的字符的ASCII码值

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main()
{
char input[20] = { 0 };
printf("请输入密码:");
scanf("%s", input);
printf("请确认密码:Y/N");
int ch = getchar();
if ('Y'==ch)
{
printf("确认成功!");
}
else
{
printf("确认失败!");
}
return 0;
}

解析:输入缓冲区的概念,getchar读取字符的时候,它并不是直接就从键盘上进行读取的,它首先要看一看输入缓冲区中是否有数据,如果没有,才会从键盘上进行读取数据, 当我们在上面这个程序中输入密码结束后,我们会在键盘上敲击一个回车进行换行,这也标志着我们的输入结束,这个回车本身并没有被放入到我们输入的字符串中去,而是被放入到了输入缓冲区中去,当getchar进行读取字符时,首先看输入缓冲区,发现输入缓冲区并不为空,然后就将输入缓冲区中的回车字符读取了,存入到了变量ch中,进而判定后不等于字符Y,所以会输出“确认失败!”。

总结:getchar先看输入缓冲区,输入缓冲区没有数据,再看键盘。

image-20230104173538856

如何避免上面的麻烦?

在getchar()确认密码前用一个getchar()将输入缓冲区的回车键吸收即可!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main()
{
char input[20] = { 0 };
printf("请输入密码:");
scanf("%s", input);
printf("请确认密码:Y/N");
getchar(); // 将回车吸收掉,来清理缓冲区的.
int ch = getchar();
if ('Y'==ch)
{
printf("确认成功!");
}
else
{
printf("确认失败!");
}
return 0;
}

puts函数

puts函数也是将字符串输出到标准输出流的函数,它的原型如下:

1
int puts(const char *s);

其中,s参数是要输出的字符串,puts函数将它输出到标准输出流(通常是控制台)。puts函数会在输出的字符串末尾自动添加一个换行符\n,并返回非负整数,表示输出的字符数(不包括换行符)。

输出函数总结

  • printf函数可以输出各种格式的数据,并支持格式化选项,灵活性更高;
  • putchar函数只能输出一个字符,并返回输出的字符的ASCII码值;
  • puts函数只能输出字符串,并自动在末尾添加一个换行符。