用于删除C中句子中所有单词出现的函数

时间:2014-10-28 18:26:54

标签: c string

我有这段代码,它会删除句子中第一次出现的单词:

#include "stdio.h"
#include "string.h"

int delete(char *source, char *word);

void main(void) {

    char sentence[500];
    char word[30];



    printf("Please enter a sentence. Max 499 chars. \n");
    fgets(sentence, 500, stdin);

    printf("Please enter a word to be deleted from sentence. Max 29 chars. \n");
    scanf("%s", word);

    delete(sentence, word);

    printf("%s", sentence);
}


int delete(char *source, char *word) {

    char *p;
    char temp[500], temp2[500];

    if(!(p = strstr(source, word))) {
        printf("Word was not found in the sentence.\n");
        return 0;
    }

    strcpy(temp, source);
    temp[p - source] = '\0';
    strcpy(temp2, p + strlen(word));
    strcat(temp, temp2);    
    strcpy(source, temp);
    return 1;
}

如何修改它以删除给定句子中所有出现的单词?在这种情况下我还可以使用strstr函数吗?

感谢您的帮助!

也可以采取完全不同的方式。

P.S。这可能听起来像是一个家庭作业问题,但它实际上是一个过去的中期问题,我想为我的期中考试做好准备!

作为一个附带问题,如果我使用fgets(word, 30, stdin)代替scanf("%s", word),它就不再起作用,并告诉我在句子中找不到该单词。为什么呢?

2 个答案:

答案 0 :(得分:3)

尝试以下

#include <stdio.h>
#include <string.h>

size_t delete( char *source, const char *word ) 
{
    size_t n = strlen( word );
    size_t count = 0;

    if ( n != 0 )
    {
        char *p = source;

        while ( ( p = strstr( p, word ) ) != NULL ) 
        {
            char *t = p;
            char *s = p + n;
            while ( ( *t++ = *s++ ) );
            ++count; 
        }
    }

    return count;
}

int main( void ) 
{
    char s[] = "abxabyababz";

    printf( "%zu\n", delete( s, "ab" ) );
    puts( s );

    return 0;
}

输出

4
xyz

关于fgets的问题,它包含字符串中的新行字符。你必须从字符串中删除它。

答案 1 :(得分:1)

如何将其修改为 删除给定句子中所有出现的单词

正如您所建议的那样,有许多方法,并且因为您以完全不同的方式开放......
这是一个不同的想法
一个句子使用空格来分隔单词。您可以使用它来帮助解决问题。请考虑使用fgets()strtok()strcat()来拆分字符串,并在不使用字符串删除的情况下重新组合它。

0)  create line buffer sufficient length to read lines from file  
    (or pass in line buffer as an argument)
1)  use while(fgets(...) to get new line from file
2)  create char *buf={0};
3)  create char *new_str; (calloc() memory to new_str >= length of line buffer) 
4)  loop on buf = strtok();, using " \t\n" as the delimiter
Inside loop:
    a. if (strcmp(buf, str_to_remove) != 0) //approve next token for concatenation
            { strcat(new_str, buf); strcat(new_str, " ");}//if not str_to_remove, 
                                                  //concatenate token, and a space
5)  free allocated memory

new_str现在包含没有出现str_to_remove的句子。

这是一个演示 ,使用这套步骤(差不多)

int delete(char *str, char *str_to_remove)
{
    char *buf;
    char *new_str;

    new_str = calloc(strlen(str)+1, sizeof(char));

    buf = strtok(str, " \t\n");
    while(buf)
    {
        if(strcmp(buf, str_to_remove) != 0)
        {
            strcat(new_str, buf);
            strcat(new_str, " ");
        }
        buf = strtok(NULL, " \t\n");
    }
    printf("%s\n", new_str);
    free(new_str);
    getchar();

    return 0;
}

int main(void)
{
    delete("this sentence had a withh bad withh word", "withh");
    return 0;
}