我正在尝试用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;。如何丢弃最后的字符。
答案 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评论解释得很好]