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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:37:54