C语言中字符串长度变量突变为0及偶数位字符提取错误问题
问题分析与修复:CS50 C语言用户名处理代码错误
问题1:变量x在循环中突变为0
原因:你定义的char new[4]数组空间不足,且错误使用strcat导致内存越界。当执行strcat(new, &name[i])时,&name[i]指向的是从第i位开始的完整字符串(比如i=1时是"ames"),而new只有4个字节的空间,追加"ames"会超出数组边界,覆盖到栈上相邻的变量x的内存,直接把x的值改成了0。
修复:
- 给
new分配足够空间:根据用户名长度x,偶数位字符最多有x/2个,加上字符串终止符\0,定义char new[x/2 + 1] = "";(C99及以上支持变长数组)。 - 放弃
strcat,改用逐个字符赋值的方式,同时维护索引记录new的当前写入位置。
问题2:提取的偶数位字符不符合预期
原因:strcat(new, &name[i])会把从name[i]开始到字符串结尾的所有字符都追加到new里,而非只添加name[i]单个字符。比如i=1时,会把"ames"全加进去,导致最终结果变成"ames"而非预期的"ae"。
修复:
- 新增索引变量
int idx = 0;,每次找到偶数位字符时,直接把name[i]赋值给new[idx++],循环结束后手动添加字符串终止符new[idx] = '\0';。
修复后的完整代码
#include <stdio.h> #include <cs50.h> #include <string.h> int main(void) { string name = get_string("whats your name ? "); int x = strlen(name); // 分配足够空间存储偶数位字符+终止符 char new[x/2 + 1] = ""; int idx = 0; // 记录new数组的当前写入位置 for (int i = 0 ; i < x ; i++) { printf("%c\n", name[i]); if ((i+1) % 2 == 0) { // 直接赋值单个字符,而非追加整个字符串 new[idx++] = name[i]; } printf("%i\n", x); } // 手动添加字符串终止符 new[idx] = '\0'; printf("hello %s , your name has %i characters \n", name, x); printf("%s\n", new); }
测试结果(输入james)
whats your name ? james j 5 a 5 m 5 e 5 s 5 hello james , your name has 5 characters ae
内容的提问来源于stack exchange,提问作者Amirhosein hajiebrahimi
相关产品推荐
相关产品推荐

