C语言如何防止字符串溢出?含argv输入长度检测方案
解决方案
当然可以在不涉及内存操作的前提下检测输入字符串的长度——因为argv传入的参数本身就是以\0结尾的C字符串,直接对原字符串做长度检查即可,无需先拷贝到你定义的str1/str2数组里。
一、检测输入字符串长度的两种方法
1. 使用标准库strlen()(最简单)
直接调用<string.h>里的strlen()函数计算argv[1]和argv[2]的长度,判断是否超过49(因为你的数组大小是50字节,最多容纳49个有效字符+1个\0结束符):
if (strlen(argv[1]) >= 50 || strlen(argv[2]) >= 50) { printf("Error: Input strings must be no longer than 49 characters.\n"); return 1; }
2. 手动遍历计数(无需依赖strlen())
如果不想用标准库函数,也可以手动遍历字符串直到遇到\0,计数字符数量:
// 自定义长度检测函数 int str_length(const char *s) { int len = 0; while (s[len] != '\0') { len++; // 提前终止:如果已经超过49,直接返回 if (len >= 50) { return len; } } return len; } // 调用检测 if (str_length(argv[1]) >= 50 || str_length(argv[2]) >= 50) { printf("Error: Input strings must be no longer than 49 characters.\n"); return 1; }
二、修改后的完整代码
需要先做长度检查,再执行拷贝和拼接,避免缓冲区溢出。另外还要注意:拼接后的字符串总长度也不能超过str1的容量(49字符),所以也要加总长度检查:
#include <stdio.h> #include <string.h> #include "mystrings.h" int main(int argc, char *argv[]) { if (argc == 3) { char str1[50]; char str2[50]; size_t len1 = strlen(argv[1]); size_t len2 = strlen(argv[2]); // 检查单个字符串长度是否超限 if (len1 >= 50 || len2 >= 50) { printf("Error: Each input string must be at most 49 characters long.\n"); return 1; } // 检查拼接后总长度是否超限(str1要容纳拼接后的字符串+结束符) if (len1 + len2 >= 50) { printf("Error: Combined length of strings exceeds 49 characters.\n"); return 1; } // 长度合法,再执行拷贝和拼接 strcpy(str1, argv[1]); strcpy(str2, argv[2]); strConcat(str1, str2); printf("Concatenated string: %s\n", str1); } else { printf("Invalid number of arguments passed. Format required:\n <STRING1> <STRING2>\n"); } return 0; }
补充说明
- 为什么不用内存操作就能检测?因为
argv指向的是程序启动时操作系统传入的字符串缓冲区,我们直接读取这个缓冲区的内容计数即可,不需要把字符串复制到自己的数组里再检查,完全符合你的需求。 - 一定要先检查再拷贝:原代码直接用
strcpy会导致缓冲区溢出(如果输入字符串超过49字符),这是严重的安全问题,必须提前拦截。
内容的提问来源于stack exchange,提问作者shestakov-dev
相关产品推荐
相关产品推荐

