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
相关产品推荐
相关产品推荐

