使用getchar()读取输入赋值给指针指向变量时数值未正确更新的问题求助
代码问题排查与修复
核心问题定位
- 写入逻辑的触发条件完全错位:现有代码仅在
getchar()读到换行符'\n'时,才会给*ciphertext赋值,正常输入的非换行内容永远走不到写入分支,自然无法更新指针指向的内存值。 - 循环终止逻辑设计错误:循环初始条件为
count_newline_chars <= 0,第一次进入循环读到非换行字符时,代码会直接执行count_newline_chars +=1,让计数变为1,循环立刻终止——整个流程下来根本没有对读到的有效输入做任何写入操作。 - 变量作用逻辑偏差:定义的
count_newline_chars本意是统计换行符数量,实际代码却是用它统计非换行字符数,逻辑和变量定义完全脱节。
修复参考代码
// 前置说明:ciphertext为int*类型的有效非空指针,指向初始值为0的内存空间 int count_newline_chars = 0; int input_first_line = 0; // 持续读取直到碰到换行或流结束 while ((input_first_line = getchar()) != '\n' && input_first_line != EOF) { // 非空判断避免空指针解引用 if (ciphertext) { *ciphertext = input_first_line; } count_newline_chars += 1; }
额外注意事项
- 如果需求是存储输入对应的十进制整数值,需要将读到的字符值做ASCII偏移转换:比如读到字符
'3'时,需要用input_first_line - '0'才能得到整数3,直接赋值的话存入的是字符对应的ASCII码值(51),不是期望的数字。 - 如果需要存储整行输入的数值而不是单个字符,还需要在循环里做字符拼接转数值的逻辑,不能只存单次
getchar()的返回值。
内容的提问来源于stack exchange,提问作者Aquila
相关产品推荐
相关产品推荐

