从以子字符串开头的单词中删除子字符串。(在C中)
我试图编写一小段代码(函数),仅当字符串中的单词以这些子字符串开头时,才删除字符串中的子字符串。看看我到现在为止都做了些什么:从以子字符串开头的单词中删除子字符串。(在C中),c,C,我试图编写一小段代码(函数),仅当字符串中的单词以这些子字符串开头时,才删除字符串中的子字符串。看看我到现在为止都做了些什么: char *string="internship, is wonderful for people who like programming" char *prefixes="intern wonder in pe" char *delsubstr(char *string, const char *prefixes) { char *tokprefix; to
char *string="internship, is wonderful for people who like programming"
char *prefixes="intern wonder in pe"
char *delsubstr(char *string, const char *prefixes)
{
char *tokprefix;
tokprefix=strtok(prefixes, " ");
while(tokprefix)
{
size_t m = strlen(tokprefix);
char *p = string;
while ((p = strstr(p, tokprefix))!= NULL)
{
{
char *q = p + m;
size_t n = strlen(q);
memmove(p, q, n + 1);
}
}
tokprefix=strtok(NULL, " ");
}
return string;
}
问题是它从任何地方移除子字符串,我只知道从开始移除的子字符串是什么。另外,如果存在“intern”和“in”子字符串,我希望从字符串中删除较大的子字符串,而不是较小的子字符串。有人有什么想法/建议吗?我认为在memmove之前有一个if条件就足够了,但我不确定
我认为在memmove之前的if条件就足够了,但我
不确定
除了修改前缀字符串文字的问题(在上面的注释中处理)之外,您大致正确:
while ((p = strstr(p, tokprefix))!= NULL)
{
if (p > string && p[-1] != ' ') // not at beginning of word?
++p; // then just advance pointer
else // else remove start of word
{
…
顺便说一句,字符串文字是不可变的。@BLUEPIXY是正确的,您必须先复制字符串。而且,如果您希望将这些单词视为单词,您也应该将该字符串标记化,在您的程序中,没有“beging of”或“end of”的概念,因为没有可以使用的单词。请使用char数组或strdup()函数编辑字符串。使用char数组而不是nativ字符串文字,例如:char前缀[]=“intern wonder in pe”;... 它从所有位置删除子字符串:
strstr
在另一个字符串中的任何位置查找字符串。如果您想知道字符串是否以某个前缀p
开头,请使用strncmp(str,p,strlen(p))==0
。