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

C语言迭代服务器中strcmp函数无法正常工作的问题求助

问题分析与解决方案

Hey there! Let's break down why your strcmp checks are failing even when the input looks correct, and fix them step by step.

核心问题:Telnet的换行符与输入处理不匹配

Telnet客户端通常会在每行输入末尾发送**\r\n(回车+换行)**,而不是单一的\n。你当前的代码只移除了最后一个字符(假设是\n),但会把\r留在输入字符串里。这个隐藏的\r会导致strcmp比较失败——比如输入会变成"GET HUMIDITY\r",而不是你预定义的"GET HUMIDITY",自然永远匹配不上。

另外,你的预定义字符串格式不一致:tempString带了\n,但其他比如"GET HUMIDITY"却没有,这也加剧了匹配问题。

具体修复步骤

1. 正确修剪输入末尾的空白字符

把当前的in[strlen(in)-1]=0;替换成一个能移除所有末尾空白(包括\r、\n、空格)的辅助函数,确保输入字符串干净一致,能和预定义值正确比对。

先添加这个辅助函数:

void trimTrailingWhitespace(char *str) {
    int len = strlen(str);
    // 从后往前遍历,移除末尾的\r、\n或空格
    while (len > 0 && (str[len-1] == '\n' || str[len-1] == '\r' || str[len-1] == ' ')) {
        str[--len] = '\0';
    }
}

然后更新你的读取循环(同时修复字符串终止问题,因为read不会自动添加空字节):

ssize_t bytesRead;
// 用sizeof(in)-1预留空字节的位置
while((bytesRead = read(fileDescriptor, in, sizeof(in)-1)) > 0) { 
    in[bytesRead] = '\0'; // 确保输入是合法的C字符串
    trimTrailingWhitespace(in); 
    checkInput(in, out); 
    write(fileDescriptor, out, strlen(out)); 
}

2. 统一预定义字符串格式

把tempString里的\n去掉,和其他比对字符串保持一致:

char tempString[] = "GET TEMPERATURE";

这样所有目标字符串格式统一,修剪后的输入就能和正确指令精准匹配了。

3. 调试小技巧(验证修复效果)

如果还是有问题,可以添加调试打印,看看服务器实际收到的输入是什么:

void checkInput(char in[], char out[]) {
    // 添加这行打印,用引号包裹能直观看到隐藏字符
    printf("Received input: '%s'\n", in);

    // ... 你原有的代码 ...
}

这能帮你捕捉到残留的隐藏字符或者输入里的拼写错误。

额外优化:避免缓冲区问题

确保in和out缓冲区足够大,能容纳最大的输入输出内容。另外,使用strcpy时要注意目标缓冲区的空间,建议用strncpy来避免缓冲区溢出风险。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:06