我的strcmp功能有什么问题?

我的strcmp功能有什么问题?,c,C,我的代码是: getline(&cmd, &len, stdin); cmd[strcspn(cmd,"\n")] = 0; char *ncmd = (char*)malloc(strlen(cmd) + 1); memset(ncmd, '\0', strlen(cmd)); strcpy(ncmd,cmd); const char *tok = strtok(ncmd, " "); // token is just string from stdin if(!strc

我的代码是:

getline(&cmd, &len, stdin);
cmd[strcspn(cmd,"\n")] = 0;
char *ncmd = (char*)malloc(strlen(cmd) + 1);
memset(ncmd, '\0', strlen(cmd));
strcpy(ncmd,cmd);

const char *tok = strtok(ncmd, " ");


// token is just string from stdin
if(!strcmp(tok, "bye")){
    printf("bye");
} else if (!strcmp(tok, "help")){
    printf("help");
} else if (!strcmp(tok, "list")){
    ......
}
如需输入:帮助和再见

Result: TOK: help
        strcmp(tok, "bye"): 6
        strcmp(tok, "help"): 0
        strcmp(tok, "list"): -10

Result: TOK: bye
        strcmp(tok, "bye"): 0
        strcmp(tok, "help"): -6
        strcmp(tok, "list"): -4
无论我键入什么,我似乎都无法提取正确的if语句。
如何修复“strcmp”函数,使其转到正确的if语句?

由于代码和
if
语句是正确的,我认为
tok
有额外的字符,例如换行符。然后,
tok
将永远不会等于您的任何单词。

当创建一个用于
strtok()
的缓冲区时,同一个缓冲区通常会被多次使用。因此,与其将其声明为:

const char *tok = strtok(ncmd, " "); //tok cannot be changed (const keyword)
创建它以便可以对其进行更改:

char *tok = strtok(ncmd, " ");//tok can be changed  (removed const keyword) 
例如:

char string[] = {"this is \n a string \t with embedded \r non-printables"};
char *tok = {0};  //declare and initialize

tok = strtok(string, " \n\r\t");
while(tok)
{
    tok = strtok(NULL, " \n\r\t");//tok will be a different value each iteration  
    //   1 - this
    //   2 - is
    //   3 - a
    //   4 - string
    //   and so on 
}
...

我没有正确理解您的代码,但我希望这就是您试图在代码中实现的目标:

int main()
{
    char list[] = "bye help list";
    char *delim = " ";
    char *pch = strtok(list,delim);
    int count = 0;
    while(pch) {
        if(!strcmp(pch,"bye")) {
            printf("i found bye at %d\n",count);
        } else if (!strcmp(pch,"help")) {
            printf("i found help at %d\n",count);
        } else if (!strcmp(pch,"list")) {
            printf("i found list at %d",count);
        }
        count++;
        pch = strtok(NULL,delim);
    }
    printf("\n");
    return 0;
}

那么什么才是真正的tok呢?它是干什么的?请出示完整的代码。你确定吗?显示阅读代码。@KadanaKanz不,真的-tok包含什么?。您需要反复检查它是否包含换行符、空格或其他不可见字符。如果您显示更多的代码,例如如何从stdin读取数据并将其读入
tok
变量,则会有所帮助。只需打印
strlen
就更可靠了。您需要发布一条说明您认为存在问题的信息。
tok
的处理是过度的,但您仍然没有显示输入来自何处。示例输出a)与代码不匹配,b)与它应该的完全匹配。如果是这种情况,解决方案将是使用
strncmp
变量。我也打算这么说。我怀疑一条落后的新线就是问题所在。去掉尾随空格,或者使用
strncmp
而不是
strcmp
。我已经删除了空格(更新的代码)并通过strlen和input进行检查:help的长度为4等。它们都匹配,因此idk我做错了什么。edit:抱歉,我刚刚意识到我编译的版本正在搜索不同的字符串,这修复了它:D