scanf族 带限制字符串长度
时间: 2025-03-01 14:02:37 浏览: 49
### C语言 `scanf` 函数带字符串长度限制的安全用法
为了防止缓冲区溢出,在使用 `scanf` 输入字符串时应当指定最大读取宽度。这可以通过在格式说明符 `%s` 中加入字段宽度来实现[^1]。
```c
#include <stdio.h>
int main(void) {
char str[10];
printf("Enter string (max 9 chars): ");
scanf("%9s", str); // 指定最多读入9个字符,留一位给'\0'
printf("You entered: %s\n", str);
}
```
上述代码展示了如何安全地限定输入字符串的最大长度为9个字符加上终止符 `\0`。这样做可以有效避免因用户输入过长而导致的栈溢出风险[^2]。
当处理更复杂的场景时,推荐采用更为健壮的方法如 `fgets()` 来代替 `scanf()` 进行字符串输入操作。`fgets()` 不仅能够设置固定的缓冲区大小从而避免潜在的风险,而且还能保留空白字符作为合法输入的一部分[^3]。
```c
#include <stdio.h>
#define MAX_LEN 10
int main(void) {
char line[MAX_LEN];
printf("Enter a line of text:\n");
if (fgets(line, sizeof(line), stdin)) { // 使用 fgets 安全获取一行文本
// 去除可能存在的换行符
size_t len = strlen(line);
if (len > 0 && line[len-1] == '\n') {
line[--len] = '\0';
}
printf("Input was: \"%s\"\n", line);
} else {
fprintf(stderr, "Error reading input.\n");
}
return 0;
}
```
对于需要严格验证输入的情况,则应该考虑利用标准库中的其他工具函数比如 `sscanf()` 或者自定义解析逻辑配合正则表达式等技术手段来进行更加精细的数据校验工作[^4]。
阅读全文
相关推荐


















