C语言 从字符串中删除子字符串?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4833347/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Removing substring from a string?
提问by Blackbinary
I have a C function, which takes a string called 'buffer', and parses it, it will match keywords and use that to assign values in a structure.
我有一个 C 函数,它接受一个名为“buffer”的字符串并解析它,它将匹配关键字并使用它来分配结构中的值。
However, some keywords I want to completely ignore.
但是,有些关键字我想完全忽略。
This program parses VCard files (.vcf, virtual business cards).
该程序解析 VCard 文件(.vcf、虚拟名片)。
Here is a sample line buffer might supply:
这是一个示例行缓冲区可能提供:
FN;CHARSET=UTF-8:David Celery
FN is a keyword im interested in, and David Celery is the value associated with FN.
FN 是我感兴趣的关键字,David Celery 是与 FN 相关的值。
However, CHARSET=UTF-8 is something I dont care about at all.
但是,CHARSET=UTF-8 是我根本不关心的。
So my question is, is there a way for me to scan my buffer and simply replace 'CHARSET=UTF-8" with "", so that I don't have to worry about parsing it (and other similar keywords I just want to ignore).
所以我的问题是,有没有办法让我扫描我的缓冲区并简单地将“CHARSET=UTF-8”替换为“”,这样我就不必担心解析它(以及我只想解析的其他类似关键字)忽略)。
Thanks,
谢谢,
回答by user411313
have a look at a simple ANSI C solution like:
看看一个简单的 ANSI C 解决方案,如:
void removeSubstring(char *s,const char *toremove)
{
while( s=strstr(s,toremove) )
memmove(s,s+strlen(toremove),1+strlen(s+strlen(toremove)));
}
回答by evandrix
Someone else has a C string find and replace function that you might find useful here.
其他人有一个 C 字符串查找和替换函数,您可能会发现这里很有用。
edit: included code snippet from link below, as per comment request
编辑:根据评论请求,包含下面链接中的代码片段
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Description:
* Find and replace text within a string.
*
* Parameters:
* src (in) - pointer to source string
* from (in) - pointer to search text
* to (in) - pointer to replacement text
*
* Returns:
* Returns a pointer to dynamically-allocated memory containing string
* with occurences of the text pointed to by 'from' replaced by with the
* text pointed to by 'to'.
*/
char *replace(const char *src, const char *from, const char *to)
{
/*
* Find out the lengths of the source string, text to replace, and
* the replacement text.
*/
size_t size = strlen(src) + 1;
size_t fromlen = strlen(from);
size_t tolen = strlen(to);
/*
* Allocate the first chunk with enough for the original string.
*/
char *value = malloc(size);
/*
* We need to return 'value', so let's make a copy to mess around with.
*/
char *dst = value;
/*
* Before we begin, let's see if malloc was successful.
*/
if ( value != NULL )
{
/*
* Loop until no matches are found.
*/
for ( ;; )
{
/*
* Try to find the search text.
*/
const char *match = strstr(src, from);
if ( match != NULL )
{
/*
* Found search text at location 'match'. :)
* Find out how many characters to copy up to the 'match'.
*/
size_t count = match - src;
/*
* We are going to realloc, and for that we will need a
* temporary pointer for safe usage.
*/
char *temp;
/*
* Calculate the total size the string will be after the
* replacement is performed.
*/
size += tolen - fromlen;
/*
* Attempt to realloc memory for the new size.
*/
temp = realloc(value, size);
if ( temp == NULL )
{
/*
* Attempt to realloc failed. Free the previously malloc'd
* memory and return with our tail between our legs. :(
*/
free(value);
return NULL;
}
/*
* The call to realloc was successful. :) But we'll want to
* return 'value' eventually, so let's point it to the memory
* that we are now working with. And let's not forget to point
* to the right location in the destination as well.
*/
dst = temp + (dst - value);
value = temp;
/*
* Copy from the source to the point where we matched. Then
* move the source pointer ahead by the amount we copied. And
* move the destination pointer ahead by the same amount.
*/
memmove(dst, src, count);
src += count;
dst += count;
/*
* Now copy in the replacement text 'to' at the position of
* the match. Adjust the source pointer by the text we replaced.
* Adjust the destination pointer by the amount of replacement
* text.
*/
memmove(dst, to, tolen);
src += fromlen;
dst += tolen;
}
else /* No match found. */
{
/*
* Copy any remaining part of the string. This includes the null
* termination character.
*/
strcpy(dst, src);
break;
}
}
}
return value;
}
void test(const char *source, const char *search, const char *repl)
{
char *after;
after = replace(source, search, repl);
printf("\nsearch = \"%s\", repl = \"%s\"\n", search, repl);
if ( after != NULL )
{
printf("after = \"%s\"\n", after);
free(after);
}
}
int main(void)
{
const char before[] = "the rain in Spain falls mainly on the plain";
printf("before = \"%s\"\n", before);
test(before, "the", "THEE");
test(before, "the", "A");
test(before, "cat", "DOG");
test(before, "plain", "PLANE");
test(before, "ain", "AINLY");
return 0;
}
/* my output
before = "the rain in Spain falls mainly on the plain"
search = "the", repl = "THEE"
after = "THEE rain in Spain falls mainly on THEE plain"
search = "the", repl = "A"
after = "A rain in Spain falls mainly on A plain"
search = "cat", repl = "DOG"
after = "the rain in Spain falls mainly on the plain"
search = "plain", repl = "PLANE"
after = "the rain in Spain falls mainly on the PLANE"
search = "ain", repl = "AINLY"
after = "the rAINLY in SpAINLY falls mAINLYly on the plAINLY"
*/
Hope this helps.
希望这可以帮助。
回答by Billy ONeal
Have a look at the methods in string.h.
查看 string.h 中的方法。
Example: (and on CodePad)
示例:(以及在CodePad 上)
#include <string.h>
#include <stdio.h>
#include <stddef.h>
int main()
{
const char * source = "FN;CHARSET=UTF-8:David Celery";
const char * newBegin = strrchr(source, ':');
if (!newBegin)
{
puts("Error!");
return -1;
}
newBegin++;
puts(newBegin);
return 0;
}
回答by jlehr
Instead of removing them, you could just ignore them, for example like this:
您可以忽略它们,而不是删除它们,例如:
#define KEY_TO_IGNORE "CHARSET=UTF-8"
char key[80];
char value[80];
char *text = "FN;CHARSET=UTF-8:David Celery";
sscanf(text, "%2s;" KEY_TO_IGNORE ":%s", key, value);
printf("key: %s, value: %s\n", key, value);

