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

C语言入门:修改数组首元素时仅后5位正确前3位异常原因求助

问题成因分析
  • 错误使用fgets直接写入目标数组
    fgets的作用是将用户输入的整行内容以C字符串的形式写入指定内存区域,你输入3并按下回车时,实际输入的内容包含三个字符:字符'3'(ASCII码值为51)、换行符'\n'(ASCII码值为10)、字符串结束标记'\0'(ASCII码值为0)。这三个字符会依次覆盖数组的前3个元素,因此你会看到前3位数值变为51、10、0,原本的5、8、2被直接覆盖。
  • 转换后的数值未回写至数组
    你已经通过strtol成功将输入的字符串转换为数值3存储在变量ret中,但没有执行anumber[0] = ret;这一步赋值操作,转换后的结果没有实际写入数组,数组中保留的还是fgets写入的字符对应的ASCII值。
修复后的代码示例
#include <stdio.h>
#include <stdlib.h>
#define MAX_ARRAY 8
void input_array(char anumber[MAX_ARRAY])
{
    // 单独定义输入缓冲区,避免污染原数组
    char input_buf[16];
    printf("\n\nPlease insert new data to the 1st array with value 5: ");
    fgets(input_buf, sizeof(input_buf), stdin);     
    long ret = strtol(input_buf, NULL, 10);
    // 将转换后的数值赋值给数组第一个元素
    anumber[0] = (char)ret;
    printf("Converting input to int ret = %d\n", ret);
    printf("\n(Array after): ");
    for (int i = 0; i < MAX_ARRAY; ++i)
    {
        printf("(%d) ", anumber[i]);
    }
}
int main(void)
{
    char arr[MAX_ARRAY] = {5, 8, 2, 9, 1, 7, 4, 3};
    printf("(Array before): ");
    for (int i = 0; i < MAX_ARRAY; ++i)
    {
        printf("(%d) ", arr[i]);
    }
    input_array(arr);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:45:05