使用strtok解析输入后strcmp字符串匹配失败问题排查
问题分析与解决方法
核心问题解析
你的代码存在两个关键问题导致匹配失败:
- strcmp判断逻辑错误:
strcmp函数返回0代表两个字符串完全相等,非0则表示不等。你的代码中if(strcmp(arg, "ATTACK"))是在字符串不相等时执行输出,和预期逻辑完全相反。 - 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
相关产品推荐
相关产品推荐

