从以子字符串开头的单词中删除子字符串。(在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