#include<stdio.h>
#include<string.h>
int main()
{
char pch[]="encrypt galvin;double royal;";
char *str=pch;
char *ptr;
//pch = strtok (dir,";");
while ((ptr =strtok_r(str,";",&str))){
printf("%s\n",ptr);
char *token=ptr;
char *en;
char cwd[524];
while((en =strtok_r(token," ",&token))){
// char *gal = strtok(NULL," ");
strcpy(cwd,token);
if (strcmp(token,"double")==0) {
strcat(cwd,cwd);
printf("Double %s Done.\n", cwd);
}
//printf("%s\n,gal");
}
}
return 0;
}
以上是我的代码。但是我尝试运行它几次却没有达到我想要的效果。我正在寻求您的帮助。
我想编写该代码,如果数组pch
有多个命令,它将把它们分成单个命令,例如
encrypt galvin
double galvin
这样做之后,它将这些命令拆分为子字符串,例如
encrypt galvin
进一步分为encrypt
,后跟
galvin
,并类似于其他任务。
然后,如果拆分子字符串中的字符串为if
,则必须比较encrypt
开头。如果它确认,那么它将从拆分字符串(encrypt galvin
)中选择第二个字符串,即galvin
,然后它就开始工作了。例如,在上面的代码中,我仅使用了一个双重命令,因此当它进入字符串double galvin
时,它会选择它,还将它拆分并选择单词double
并进行比较。然后如果是,则进一步选择单词galvin
并将其加倍,从而返回galvingalvin
作为输出。所以请您提供支持
答案 0 :(得分:0)
此行产生未定义的行为:
strcat(cwd, cwd);
因为不允许源和目标重叠。您可以复制cwd
以便将其连接起来。
char cwd2[524];
strcpy(cwd2, cwd);
strcat(cwd, cwd2);
您没有正确使用strtok_r()
。循环中对strtok_r()
的第一次调用将指向被解析的字符串的指针作为第一个参数,并将指向某个 other 指针的指针作为第三个参数。当您在循环中重复这些调用时,第一个参数应为NULL
-告诉strtok_r()
您要继续解析同一字符串。
指向令牌的指针是从函数返回的值,而不是第三个参数。
找到单词double
之后,您需要阅读 next 标记,以获取应加倍的单词。您的代码使当前单词(即double
)加倍。
这是更正的代码。
#include<stdio.h>
#include<string.h>
int main()
{
char pch[]="encrypt galvin;double royal;";
char *cmd;
char *ptr;
//pch = strtok (dir,";");
for (cmd = strtok_r(pch,";",&ptr); cmd; cmd = strtok_r(NULL, ";", &ptr)) {
printf("%s\n",cmd);
char *word;
char *ptr2;
char cwd[524];
for (word = strtok_r(cmd, " ", &ptr2); word; word = strtok_r(NULL, " ", &ptr2)) {
if (strcmp(word,"double")==0) {
char *word2 = strtok_r(NULL, " ", &ptr2);
strcpy(cwd, word2);
strcat(cwd, word2);
printf("Double %s Done.\n", cwd);
}
}
}
return 0;
}