getSize函数字符串长度计算异常致参数拼接截断错误求助
问题分析与修复:C语言命令行参数拼接截断异常
问题重现
输入参数hello和world时,预期输出hello worl(含空格共10字符),但实际输出hello wor;调试发现自定义的getSize函数错误计算hello 的长度为7(实际应为6),但能正确计算helloo 的长度为7。
核心原因
- 字符串未正确终止:代码中手动将
combined_text的末尾设为%(应为空格),但未添加字符串终止符\0。这导致getSize遍历字符串时,会读取%之后的内存垃圾数据,直到随机遇到\0,从而得到错误的长度值。比如拼接hello后,手动赋值%覆盖了原有的\0,getSize多读了一个垃圾字节,将6字符误算为7。 - 笔误:用
%替代空格:需求要求参数间用空格分隔,但代码错误使用%代替。 - 重复调用
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
相关产品推荐
相关产品推荐

