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

C语言自定义字符输入函数通过指针传参无法正常终止问题

核心错误原因
  • 最直接的致命错误:循环条件中误将赋值运算符写为相等判断运算符,while((r == getchar()) != EOF) 中的==应改为=。当前写法完全没有把getchar()读取到的字符赋值给变量r,r是未初始化的局部变量,值为随机垃圾值,因此后续判断r == '\n'永远不会触发,输入换行后函数自然不会终止。
  • 第二个隐含错误:存储读取结果的变量r类型定义错误。getchar()的返回值为int类型,目的是兼容返回值EOF(通常值为-1)。如果使用char类型存储,当系统默认char为无符号类型时,EOF会被截断为255,永远无法和EOF判断相等,会触发死循环。
  • 第三个边界逻辑缺陷:当前到达长度上限时直接终止,没有处理超过长度的残留输入字符,会导致后续读取输入操作直接读到缓冲区残留的多余字符。
修复后的参考代码
#include <stdio.h>
// 假设WORD_LEN已定义为25
void word_enter(char *word_search)
{
    int r; // 改为int类型兼容EOF
    char *m = word_search;
    printf("Enter the word to search for: ");
    // 改为赋值运算符
    while((r = getchar()) != EOF)
    {
        // 先判断是不是换行,再判断是否到达长度上限
        if(r == '\n')
        {
            *m = '\0';
            break;
        }
        if(m == &word_search[WORD_LEN - 1])
        {
            *m = '\0';
            // 可选:清空剩余的输入缓冲区,避免残留字符影响后续输入
            while((r = getchar()) != EOF && r != '\n');
            break;
        }
        *m++ = r;
    }
}
补充说明

如果不需要处理超出长度的输入残留,可以去掉缓冲区清空的逻辑,核心修复两点即可:将==改为=、将char r改为int r。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:45:03