c中的遍历子字符串

时间:2018-04-20 17:08:14

标签: c string pointers substring

我正在尝试编写一个方法:traverseKeyAndValue(text),它将遍历一串多个键值对并打​​印。即,如果传递“key1:value1,key2:value2,key3:value3”,它将提取键和值。 我已经使用了另一种基于开始和结束文本的子串的方法。 以下是我的代码:

void extractSubstring (char *source, char *dest, char *startingText, char *endingText, bool includeStart) {
     size_t sourceLen = strlen(source);
     size_t startLen = strlen(startingText); 
     size_t endingIndex = sourceLen; 
     source = strstr (source, startingText); 
     if(!includeStart){ 
        source+=startLen; 
        } 
     if(strlen(endingText)>0){ 
        endingIndex = strstr (source, endingText) - source; 
         strncpy(dest, source, endingIndex); 
     } 
     else { 
        strcpy (dest, source); 
     } 
     dest[endingIndex] = '\0';
}

void traverseKeyAndValue(char *inputText){
    int i=0;
    while(inputText[i]!='\0'){
        char key[18];
        char value[8];
        extractSubstring(inputText,key,"",":",false);
        printf(key);
        extractSubstring(inputText,value,":",",",false);
        printf(value);
        size_t keylen = strlen(key);
        size_t valuelen= strlen(value);
        int total= keylen+valuelen+1;
        inputText+=total;
    }
}

我有,使用指针inputText,我在每次迭代中递增键+值的长度以指向下一个条目。但这是“没有输出”

1 个答案:

答案 0 :(得分:2)

我展示了如何使用strtok的简单示例。我假设输入来自fgets(保留任何换行符)。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char input[] = "key1:value1,key2:value2,key3:value3\n"; // example input from fgets
    char seper[] = " ,:\t\n";                               // seperators
    char *tok;
    tok = strtok(input, seper);
    while(tok) {
        printf("%-20s", tok);
        tok = strtok(NULL, seper);
        if(tok) {
            printf("%s", tok);
            tok = strtok(NULL, seper);
        }
        printf("\n");
    }
}

节目输出:

key1                value1
key2                value2
key3                value3

有比strtok更好的功能,这些功能不可重入,例如strtok_rstrtok_s以及strsep,具体取决于平台。

可以改进示例来处理缺少的值字段,但这是一个基本的演示。