目录
1 getchar() 函数
1.1 功能描述
getchar() 函数用于从标准输入流 stdin 中读取下一个可用的字符,并将其作为整数返回(因为字符在 C 语言中实际上是以整数形式存储的)。如果遇到文件结束符(EOF,即 End Of File)或者发生读取错误,则返回 EOF。
1.2 函数原型
函数原型定义在 <stdio.h> 头文件中,因此在使用 getchar() 函数之前需要包含这个头文件。
#include <stdio.h>
int getchar(void);
- 参数:getchar() 函数没有参数。
- 返回值:正常情况下,getchar() 返回从标准输入读取到的下一个字符,以整数形式表示;如果到达文件结束或发生读取错误,则返回 EOF(通常定义为 -1)。
1.3 案例演示
#include <stdio.h>
int main()
{
int ch; // 使用 int 类型来存储 getchar() 的返回值,以便处理 EOF
printf("请输入一个字符: ");
ch = getchar(); // 读取用户输入的一个字符
if (ch != EOF)
{
printf("您输入的字符是: %c\n", ch); // 显示用户输入的字符
}
else
{
printf("读取输入时发生错误。\n");
}
return 0;
}
输出结果如下所示:
1.4 注意事项
缓冲区问题:getchar() 会从标准输入的缓冲区中读取字符。如果之前有其他输入操作(如使用 scanf() 输入字符串或数字),而用户输入后多按了回车键,那么这个换行符(\n)会被 getchar() 读取。为了避免这种情况,可以在调用 getchar() 之前清空输入缓冲区,例如使用 while ((ch = getchar()) != '\n' && ch != EOF); 来读取并丢弃所有直到换行符的字符。
EOF 处理:当 getchar() 遇到文件结束或输入错误时,会返回 EOF。在程序中应该检查返回值是否为 EOF,以正确处理这些情况。
变量类型:由于 getchar() 的返回值可能是一个字符(0 到 255 之间的整数)或者是 EOF(通常为 -1),所以建议使用 int 类型而不是 char 类型来存储 getchar() 的返回值,以确保可以正确地检测到 EOF。
阻塞行为:当 getchar() 被调用且标准输入缓冲区中没有可用数据时,程序会暂停执行,等待用户输入。这意味着 getchar() 是一个阻塞调用。
2 putchar() 函数
2.1 功能描述
putchar() 函数用于将一个字符写入标准输出流 stdout。如果写入成功,函数返回该字符;如果发生写入错误,则返回 EOF。
2.2 函数原型
函数原型定义在 <stdio.h> 头文件中,因此在使用 putchar() 函数之前需要包含这个头文件。
#include <stdio.h>
int putchar(int c);
参数:
- c:要写入标准输出的字符。虽然参数类型是 int,但实际上只需要传入一个字符即可。这是因为字符在 C 语言中是以整数形式存储的,而 putchar() 需要能够处理 EOF(通常定义为 -1),所以参数类型是 int。
返回值:
- 如果写入成功,返回写入的字符(以 int 形式)。
- 如果发生写入错误,返回 EOF(通常定义为 -1)。
2.3 案例演示
#include <stdio.h>
int main()
{
int c;
printf("请输入一些文本(按 Enter 结束输入):\n");
// 读取用户输入的每个字符
// 读取直到遇到换行符
while ((c = getchar()) != '\n')
{
// 输出读取到的字符
putchar(c);
}
// 输出换行符,使输出更加整洁
putchar('\n');
return 0;
}
输出结果如下所示:
2.4 注意事项
参数类型:虽然 putchar() 的参数类型是 int,但在实际使用中通常传递一个 char 类型的字符。这是因为字符在 C 语言中是以整数形式存储的,而 putchar() 需要能够处理 EOF(通常定义为 -1),所以参数类型是 int。
错误处理:putchar() 在写入失败时返回 EOF。在程序中应该检查返回值是否为 EOF,以正确处理这些情况。
缓冲区问题:putchar() 写入的字符可能会被缓冲,直到缓冲区满或遇到换行符(\n)才会实际写入到标准输出。如果需要立即刷新缓冲区,可以使用 fflush(stdout) 函数。
与 printf() 的区别:虽然 putchar() 和 printf() 都可以用于输出字符,但 putchar() 更简单,只用于输出单个字符,而 printf() 可以格式化输出多个数据类型。
3 gets() 函数
3.1 功能描述
gets() 函数用于从标准输入流 stdin 读取一行字符(直到遇到换行符 \n 或文件结束符 EOF),并将读取的字符存储到指定的字符数组中。换行符 \n 不会被存储到数组中,但在读取过程中会被消耗掉。读取完成后,会在数组末尾添加一个空字符 \0 以终止字符串。
3.2 函数原型
函数原型定义在 <stdio.h> 头文件中,因此在使用 gets() 函数之前需要包含这个头文件。
#include <stdio.h>
char *gets(char *str);
参数:
- str:指向字符数组的指针,用于存储读取的字符串。
返回值:
- 成功时,返回 str,即指向读取字符串的指针。
- 如果遇到文件结束符 EOF 或读取错误,返回 NULL。
3.3 案例演示
#include <stdio.h>
int main()
{
char buffer[100]; // 定义一个足够大的字符数组来存储输入的字符串
printf("请输入一行文本:");
// 读取一行文本
if (gets(buffer) != NULL)
{
printf("您输入的文本是:\n");
printf("%s\n", buffer); // 使用 printf() 输出字符串
}
else
{
printf("读取输入时发生错误。\n");
}
return 0;
}
输出结果如下所示:
3.4 注意事项
缓冲区溢出风险:gets() 函数不会检查目标数组的大小,如果用户输入的字符串长度超过了数组的容量,会导致缓冲区溢出,从而引发严重的安全问题。因此,强烈建议避免使用 gets(),改用更安全的替代函数,如 fgets()。
换行符处理:gets() 会读取并消耗换行符 \n,但不会将其存储在目标数组中。如果后续需要处理换行符,需要注意这一点。
结束符处理:gets() 读取完成后,会在数组末尾添加一个空字符 \0 以终止字符串。
错误处理:如果遇到文件结束符 EOF 或读取错误,gets() 会返回 NULL。在程序中应该检查返回值,以正确处理这些情况。
替代函数:推荐使用 fgets() 函数代替 gets(),因为 fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险。
4 puts() 函数
4.1 功能描述
puts() 是 C 语言标准库中用于将字符串输出到标准输出流 stdout 的函数。与 printf() 不同,puts() 专门用于输出字符串,并且在输出字符串后自动添加一个换行符 \n。
4.2 函数原型
函数原型定义在 <stdio.h> 头文件中,因此在使用 puts() 函数之前需要包含这个头文件。
#include <stdio.h>
int puts(const char *str);
参数:
- str:指向要输出的字符串的指针。
返回值:
- 成功时,返回非负值(通常是 0 或 1)。
- 如果输出失败,返回 EOF(通常定义为 -1)。
4.3 案例演示
#include <stdio.h>
int main()
{
char str[20]; // 定义一个字符数组来存储输入的字符串
puts("Enter a line of text :");
gets(str); // 读取一行文本
puts("You entered: ");
puts(str); // 使用 puts() 输出字符串
return 0;
}
输出结果如下所示:
4.4 注意事项
换行符:puts() 会在输出的字符串末尾自动添加一个换行符 \n。如果不需要换行符,可以使用 fputs() 函数,它不会自动添加换行符。
错误处理:如果输出失败,puts() 会返回 EOF。在程序中应该检查返回值,以正确处理这些情况。使用 fprintf(stderr, ...) 将错误信息输出到标准错误流 stderr,而不是标准输出流 stdout,以确保错误信息不会与正常输出混淆。
字符串终止符:puts() 要求字符串必须以空字符 \0 终止。如果传入的字符串不是以 \0 终止的,可能会导致未定义行为。
5 fgets() 函数
5.1 功能描述
fgets() 是 C 语言标准库中用于从输入流中读取一行字符的函数。与 gets() 不同,fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险。fgets() 会读取指定数量的字符(包括换行符 \n),并将读取的字符存储到指定的字符数组中,最后在数组末尾添加一个空字符 \0 以终止字符串。
5.2 函数原型
函数原型定义在 <stdio.h> 头文件中,因此在使用 fgets() 函数之前需要包含这个头文件。
#include <stdio.h>
char *fgets(char *str, int n, FILE *stream);
参数:
- str:指向字符数组的指针,用于存储读取的字符串。
- n:要读取的最大字符数(包括终止空字符 \0)。实际读取的字符数最多为 n-1,以确保有足够的空间存储终止空字符。
- stream:输入流,通常为 stdin 表示标准输入。
返回值:
- 成功时,返回 str,即指向读取字符串的指针。
- 如果遇到文件结束符 EOF 或读取错误,返回 NULL。
5.3 案例演示
#include <stdio.h>
int main()
{
char str[100]; // 定义一个足够大的字符数组来存储输入的字符串
printf("Enter a line of text :");
// 读取一行文本
if (fgets(str, sizeof(str), stdin) != NULL)
{
printf("You entered: ");
// printf("%s\n", str); // 使用 printf() 输出字符串
puts(str); // 自动添加一个换行符 \n
}
else
{
printf("读取输入时发生错误。\n");
}
return 0;
}
输出结果如下所示:
5.4 注意事项
缓冲区溢出保护:fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险。这使得 fgets() 比 gets() 更安全。实际读取的字符数最多为 n-1,以确保有足够的空间存储终止空字符 \0。
换行符处理:fgets() 会读取并存储换行符 \n(如果在读取的字符数范围内)。如果需要去除换行符,可以手动处理:
size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
错误处理:如果遇到文件结束符 EOF 或读取错误,fgets() 会返回 NULL。在程序中应该检查返回值,以正确处理这些情况。可以使用 fprintf(stderr, ...) 将错误信息输出到标准错误流 stderr,而不是标准输出流 stdout,以确保错误信息不会与正常输出混淆。