我怎样才能将数组位置分配给在c中由strtock_r拆分的字符串

时间:2018-07-07 00:07:38

标签: c

#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作为输出。所以请您提供支持

1 个答案:

答案 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;
}