在C中提取子字符串

时间:2018-04-18 15:50:40

标签: c arrays string substring

我正在尝试用C编写一个方法,它将在起始字符串和结束字符串之间提取子字符串。基于布尔标志,它可能包含/排除起始子字符串。 即,

 char source[100] = "Some random text with $$KEY:value$$";
 char dest[12];
 extractSubstring (source, dest, "KEY:", "$", false);

这应该填充dest =" value"。

我的计划如下:

#include <stdio.h>
typedef int bool;
#define true 1
#define false 0

int main()
{
    char source[100] = "Some random text with $$KEY:value$$";
    char dest[12];
    extractSubstring (source, dest, "KEY:", "$", false);
    return 0;
}

void extractSubstring (char *source, char *dest, char *startingText,
          char *endingText, bool includeStart)
{
    int sourceLen = strlen(source);
    int startLen = strlen(startingText);
    int endingIndex = sourceLen;
    source = strstr (source, startingText);
    if(includeStart){
        strcpy (dest, source);
    }
    else{
       source+=startLen;
       strcpy (dest, source);
    }
    if(strlen(endingText)>0){
        int endingIndex = strstr (dest, endingText) - dest;

    }
    dest[endingIndex] = '\0';
    printf(dest);
}

这将填补目标&#34;值$$&#34;而不是&#34;价值&#34;。如何丢弃最后的字符。

1 个答案:

答案 0 :(得分:2)

问题来自变量的生命周期(此处为endingIndex)。删除int应该可以解决问题,但我建议不要将不必要的字符写入dest(冒着溢出的风险)。
(另外,您应该使用size_t类型表示数组长度。)

您应该以这种方式优化字符串的写入方式:

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';
    printf(dest);
}

希望它有所帮助。

[编辑:wildplasser评论解释得很好]