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

自定义strcmp函数遇EOF返回异常,求无魔法数的宏解决方案

自定义strcmp处理EOF场景的问题解决

问题背景

系统编程实验课(C语言课程)作业中实现了自定义strcmp函数,该函数在常规场景下与标准库strcmp表现一致,但遇到EOF时,标准库strcmp会返回-1,而自定义实现会返回0、1或-1。希望通过宏处理该场景,但尝试多种宏均无效,仅直接判断十进制-65的宏有效,想避免使用魔法数。

运行环境:VMware Workstation 17 Player 运行 Ubuntu 16.04(学校要求)

尝试过的无效宏

  • 检查首字符是否为EOF:
    #define EOF_CHECK(s1, s2) if ((s1)[0] == EOF || (s2)[0] == EOF ) return -1; 
    
  • 检查首字符是否为空字符:
    #define EOF_CHECK(s1, s2) if ((s1)[0] == '\0' || (s2)[0] == '\0' ) return -1; 
    
  • 检查指针是否为空:
    #define EOF_CHECK(s1, s2) if ((s1) == NULL || (s2) == NULL ) return -1; 
    

核心问题分析

标准C中EOF是一个宏,通常定义为-1,但你打印出的scanf接收EOF后的值为十进制-65,这说明你遇到的并非真正的EOF标记,而是输入流中混入了ASCII值为0xBF(有符号char表示为-65)的字符。

标准库strcmp的返回值仅由两个字符串的字符比较结果决定,不会因为字符串中存在某个特定字符就固定返回-1。你的问题根源可能是输入读取逻辑错误:比如错误地将scanf的返回值(当遇到EOF时scanf返回EOF)存入了字符串,或者在读取输入时未正确处理EOF状态,导致异常字符被写入字符串。

解决方案

1. 替换魔法数为可读的字符常量

如果确实需要处理这个0xBF字符,可使用十六进制字符常量代替十进制-65,代码可读性更强:

#define EOF_CHECK(s1, s2) if ((s1)[0] == '\xBF' || (s2)[0] == '\xBF') return -1;

2. 修复输入读取逻辑(推荐)

排查输入处理代码:

  • 使用scanf读取字符串时,scanf的返回值是成功读取的变量数,当遇到EOF时返回EOF(通常为-1),这个值不应存入字符串。
  • 若使用getchar或类似函数读取字符,当返回EOF时应停止读取,不要将EOF写入字符串缓冲区。

示例正确的字符串读取逻辑:

char buf[100];
int ret = scanf("%s", buf);
if (ret == EOF) {
    // 处理文件结束,不要操作buf
    return;
}
// 正常使用buf

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:13:24