我的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