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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:06:07