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

