0

我在谷歌搜索时遇到了以下代码,效果很好。(感谢 Chaitanya Bhatt @ Performancecompetence.com)

下面的函数搜索传递的分隔符的最后一次出现,并将输入字符串的剩余部分保存到返回的输出字符串中。

void strLastOccr(char inputStr[100], char* outputStr, char *delim)
    {
        char *temp, *temp2;
        int i = 0;
        temp = "";
        while (temp!=NULL)
        {
            if(i==0)
            {   
                temp2 = temp;
                temp = (char *)strtok(inputStr,delim);
                i++;
            }
            if(i>0)
            {
                temp2 = temp;
                temp = (char *)strtok(NULL,delim);
            }
            lr_save_string(temp2,outputStr);
        }
    }

基本上试图添加两个新选项来传递。

  1. Occurrence No:不是默认为最后一次出现,而是允许指定在哪个出现处停止并保存字符串的剩余部分。

  2. 要保存的部分字符串:(Left,Right)目前,一旦找到分隔符,字符串就会保存在右侧。附加选项旨在让用户指定用于找到分隔符的左侧或右侧。

    void strOccr(char inputStr[100], char* outputStr, char *delim, int *occrNo, char *stringSide)

所以问题是我需要对上述功能进行哪些修改?实际上也可以这样做吗?

更新

在我坚持下去之后,我能够锻炼出一个解决方案。

由于我在另外 6 个小时内无法回答我自己的问题,因此将向谁可以提供改进的功能奖励积分。具体来说,我不喜欢注释“//删除字符串末尾的分隔符”下的代码。

void lr_custom_string_delim_save (char inputStr[500], char* outputStr, char *delim, int occrNo, int stringSide)
{
    char *temp, *temp2;
    char temp3[500] = {0};
    int i = 0;
    int i2;
    int iOccrNo = 1;
    temp = "";

    while (temp!=NULL) {
        if(i==0) {
            temp2 = temp;
            temp = (char *)strtok(inputStr,delim);
            i++;
        }

        if(i>0) {
            temp2 = temp;
            temp = (char *)strtok(NULL,delim);

            if (stringSide==0) {
                if (iOccrNo > occrNo) {
                    strcat(temp3, temp2);
                        // Ensure an extra delim is not added at the end of the string.
                        if (temp!=NULL) {
                            // Adds the delim back into the string that is removed by strtok.
                            strcat(temp3, delim);
                        }
                }
            }

            if (stringSide==1) {
                if (iOccrNo <= occrNo) {
                    strcat(temp3, temp2);
                    strcat(temp3, delim);
                }
            }
            // Increase the occurrence counter.
            iOccrNo++;
        }
    }

    // Removes the delim at the end of the string.
    if (stringSide==1) {
        for( i2 = strlen (temp3) - 1; i2 >= 0 
        && strchr ( delim, temp3[i2] ) != NULL; i2-- )
        // replace the string terminator:
        temp3[i2] = '\0';
        }

    // Saves the new string to new param.
    lr_save_string(temp3,outputStr);
}
4

1 回答 1

1

你真的只需要做一些修改。当您开始使用 strtok() 遍历字符串时,您可以存储两个变量 char *current、*previous。

当您点击每个新令牌时,将“当前”移动到“上一个”并存储新的“当前”。在字符串解析结束时,查看“previous”的值以从最后一个元素中获取第二个。

其他选项,保留一个计数器并使用 LoadRunner 变量处理机制 lr_save_string(token_value,"LR_variable_name_") 构建一个伪数组。当然,您首先需要构建变量名称字符串。当您退出解析操作时,您的 count 变量可能会保存从字符串中解析出的令牌元素的总数,然后您可以使用 (counter-1) 索引值来构建您的字符串。

char foo[100]="";
...
sprint(foo, "{LR_variable_name_%d}",counter-1);
lr_message("My second to last element is %s",lr_eval_string(foo));

可能还有其他选择,但这是我想到的两个。另外,我向你推荐一本书,我推荐给所有想要复习他们的 C 的人(包括我的兄弟和我的叔叔),“C for Dummies”。您可以在 LoadRunner 中利用字符串处理方面的许多不错的选项。

于 2012-02-26T20:40:43.740 回答