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

getSize函数字符串长度计算异常致参数拼接截断错误求助

问题分析与修复:C语言命令行参数拼接截断异常

问题重现

输入参数hello和world时,预期输出hello worl(含空格共10字符),但实际输出hello wor;调试发现自定义的getSize函数错误计算hello 的长度为7(实际应为6),但能正确计算helloo 的长度为7。

核心原因

  1. 字符串未正确终止:代码中手动将combined_text的末尾设为%(应为空格),但未添加字符串终止符\0。这导致getSize遍历字符串时,会读取%之后的内存垃圾数据,直到随机遇到\0,从而得到错误的长度值。比如拼接hello后,手动赋值%覆盖了原有的\0,getSize多读了一个垃圾字节,将6字符误算为7。
  2. 笔误:用%替代空格:需求要求参数间用空格分隔,但代码错误使用%代替。
  3. 重复调用getSize加剧错误:多次调用getSize遍历未终止的字符串,每次计算的长度都不可靠,进一步导致后续截断逻辑出错。

修复后的代码

#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    // 初始化combined_text为空字符串,分配11字节空间(10个有效字符+终止符)
    char combined_text[11] = {0};
    int current_len = 0; // 缓存当前字符串长度,避免重复计算
    int i;

    for(i = 1; i < argc; i++) {
        int argSize = strlen(argv[i]);

        if(current_len + argSize <= 10) {
            // 拼接当前参数
            strcat(combined_text, argv[i]);
            current_len += argSize;
            // 未达10字符时添加空格分隔符
            if(current_len != 10) {
                strcat(combined_text, " ");
                current_len++;
            } else {
                break;
            }
        } else {
            int diff = 10 - current_len;
            // 截断拼接剩余部分,strncat会自动添加终止符
            strncat(combined_text, argv[i], diff);
            break;
        }
    }
    printf("\n%s", combined_text);
    return 0;
}

修复说明

  • 用标准库strlen替代自定义的getSize,避免手动实现的潜在问题,确保长度计算准确。
  • 用current_len变量缓存当前字符串长度,避免重复遍历字符串,同时彻底规避未终止字符串导致的长度错误。
  • 用strcat添加空格分隔符,自动处理字符串终止符,保证combined_text始终是合法的C字符串。
  • 初始化combined_text为全0(空字符串),并分配足够的内存空间,防止缓冲区溢出。
  • 修正了用%代替空格的笔误,符合需求要求。

内容的提问来源于stack exchange,提问作者Nebelmonster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:47:10