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

使用strtok解析输入后strcmp字符串匹配失败问题排查

问题分析与解决方法

核心问题解析

你的代码存在两个关键问题导致匹配失败:

  1. strcmp判断逻辑错误:strcmp函数返回0代表两个字符串完全相等,非0则表示不等。你的代码中if(strcmp(arg, "ATTACK"))是在字符串不相等时执行输出,和预期逻辑完全相反。
  2. fgets读取的换行符残留:fgets会将用户输入末尾的换行符\n也读入input数组。比如输入"ATTACK"回车后,input内容为"ATTACK\n",用空格做分隔符调用strtok时,第一个token会是"ATTACK\n",和"ATTACK"对比自然不相等。

修正后的代码示例

#include <string.h>
#include <stdio.h>

int main () {
   char input[100];
   printf("Enter your input: ");
   fgets(input, 100, stdin);
   
   // 移除fgets读取的换行符
   size_t len = strlen(input);
   if (len > 0 && input[len-1] == '\n') {
       input[len-1] = '\0';
   }
   
   printf("Reading input... \n");
   const char s[2] = " ";
   char *arg;
   
   /* 获取第一个token */
   arg = strtok(input, s);
   printf("First word: %s\n", arg);
   
   // 修正strcmp判断逻辑:返回0时才是匹配成功
   if(strcmp(arg, "ATTACK") == 0){
       printf("Input Match\n");
   }
   
   return(0);
}

通用空白字符清理方法

如果需要处理字符串中所有首尾空白(包括空格、制表符、换行符等),可以实现一个简单的清理函数:

#include <ctype.h>

// 去除字符串首尾的空白字符
void trim_whitespace(char *str) {
    // 跳过开头空白
    while (isspace((unsigned char)*str)) {
        str++;
    }
    
    if (*str == '\0') {
        return;
    }
    
    // 定位结尾空白并截断
    char *end = str + strlen(str) - 1;
    while (end > str && isspace((unsigned char)*end)) {
        end--;
    }
    end[1] = '\0';
}

使用时,在调用strtok前执行trim_whitespace(input);即可完成输入字符串的首尾空白清理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:56:03