C语言自定义字符串拼接程序第二个for循环无运行效果问题咨询
问题原因分析
导致第二个循环看似没有执行效果的核心原因有3处:
- 第一个for循环错误复制了字符串终止符:
strnlen返回的是不包含\0的字符串长度,你使用i <= string1Len作为循环条件,会把string1末尾的\0一起复制到string3的string1Len下标位置。C语言中字符串以\0作为结束标记,printf输出时碰到这个提前写入的\0就会停止,自然看不到后续拼接的内容,误以为第二个循环没有执行。 - 第二个for循环的
string2索引逻辑错误:第二个循环的变量i是string3的偏移量,你直接用i作为string2的下标,访问到的是string2超出自身长度的非法内存,根本取不到string2的有效字符,极端情况还会触发段错误。 - 终止符写入位置越界:你声明的
string3总长度为string1Len + string2Len + 1,合法下标范围是0 ~ string1Len + string2Len,你写入\0的位置string1Len + string2Len + 1已经超出数组边界,属于未定义行为。
修正后的代码
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { // 增加参数合法性判断,避免未传参时的非法访问 if (argc < 3) { printf("请传入两个字符串参数\n"); return 1; } char *string1 = argv[1]; char *string2 = argv[2]; int string1Len = strnlen(string1, 50); int string2Len = strnlen(string2, 50); char string3[string1Len + string2Len + 1]; // 仅复制string1的有效字符,不包含终止符 for (int i = 0; i < string1Len; i++) { string3[i] = string1[i]; } // 调整string2的索引逻辑,从0开始取有效字符 for(int i = string1Len; i < string1Len + string2Len; i++) { string3[i] = string2[i - string1Len]; } // 在合法的最后位置写入终止符 string3[string1Len + string2Len] = '\0'; printf("%s %d %d\n", string3, string1Len, string2Len); return 0; }
修正逻辑说明
- 调整第一个for循环的判断条件为
i < string1Len,仅复制string1的有效字符,避免提前写入终止符 - 第二个for循环的起始位置调整为
string1Len,承接第一个循环的末尾位置,同时将string2的索引改为i - string1Len,保证从string2的第一个字符开始取 - 终止符写入位置调整为
string3的最后一个合法下标,避免数组越界
内容的提问来源于stack exchange,提问作者Lew Ashby 85
相关产品推荐
相关产品推荐

