You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:03:17