C语言使用strtok分割字符串后strcmp比较恒返回false如何解决?
问题根因
read()是系统调用,仅负责按字节读取内容,不会自动在读取结果末尾添加C字符串必需的结束符\0,后续strtok、strcmp函数工作依赖\0判断字符串边界,未补结束符会导致字符串处理逻辑完全异常。- 终端输入内容后按下的回车会被识别为换行符
\n存入缓冲区,你的代码仅配置了空格作为strtok的分割符,输入exit后回车分割得到的实际字符串是exit\n,和目标字符串exit做strcmp自然返回非0值,匹配逻辑无法触发。
修复步骤
- 用变量
n接收read()的返回值,拿到实际读取的字节数,在读取内容末尾手动补充\0,同时读取时预留1字节位置放结束符避免缓冲区溢出。 - 将
strtok的分割符修改为同时包含空格、换行符,避免分割结果末尾残留换行。 - 可选:匹配到
exit后可新增break提前终止循环,打印hi后可新增fflush(stdout)避免输出缓存未刷新的问题。
修正后完整代码
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define BUFFSIZE 1024 int main() { int n; char buffer[BUFFSIZE]; int pos = 0; char *parse; char *buf[BUFFSIZE]; // 预留1字节位置放结束符,避免缓冲区溢出 n = read(STDIN_FILENO, buffer, BUFFSIZE - 1); // 手动补充字符串结束符 buffer[n] = '\0'; // 分割符同时包含空格和换行,过滤末尾回车 parse = strtok(buffer, " \n"); while (parse != NULL) { buf[pos] = parse; pos++; parse = strtok(NULL, " \n"); } for (int i = 0; i < pos; i++) { if (strcmp(buf[i], "exit") == 0) { printf("hi"); fflush(stdout); // 可选:匹配到目标后直接跳出循环 // break; } printf("%s\n", buf[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Darsh Patel
相关产品推荐
相关产品推荐

