C语言字符、字符串与输入输出操作详解
1. 字符与字符串处理
1.1 gets函数的问题
gets函数逐字符读取输入,当读取到EOF或换行符 \n 时停止。然而,它在写入目标数组时不会检查数组边界,可能导致越界写入。以下是一个使用gets函数的示例代码:
#include <stdio.h>
#include <stdlib.h>
void get_y_or_n(void) {
char response[8];
puts("Continue? [y] n: ");
int c;
char *p = response;
while ((c = getchar()) != EOF && c != '\n') {
*p++ = c;
}
*p = '\0';
if (response[0] == 'n')
exit(0);
}
这个代码中的while循环没有考虑目标数组的大小,可能会造成缓冲区溢出。
1.2 Annex K边界检查接口
C11引入了Annex K边界检查接口,提供了一些替代函数,用于确保输出缓冲区足够大以容纳预期结果,并在不满足条件时返回失败指示。这些函数旨在防止数据写入数组末尾之外,并对所有字符串结果进行空终止。
1.2.1 gets_s函数
gets_s函数可以消除gets函数调用导致的未定义行为。以下是使用gets_s函数的示例代码:
C语言字符字符串与输入输出详解
超级会员免费看
订阅专栏 解锁全文
5906

被折叠的 条评论
为什么被折叠?



