首页 > 解决方案 > 如何删除字符串中的相似词?

问题描述

我有程序从字符串中删除相似的单词,但这个程序只删除一次单词而不是重复的单词。

例如输入:

sabunkerasmaskera kera

并且应该输出:

sabunmas

这是我的代码:

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

void remove(char x[100], char y[100][100], char words[100]) {
    int i = 0, j = 0, k = 0;
    for (i = 0; x[i] != '\0'; i++) {
        if (x[i] == ' ') {
            y[k][j] = '\0';
            k++;
            j = 0;
        } else {
            y[k][j] = x[i];
            j++;
        }
    }
    y[k][j] = '\0';
 
    j = 0;
    for (i = 0; i < k + 1; i++) {
        if (strcmp(y[i], kata) == 0) {
            y[i][j] = '\0';
        }
    }
 
    j = 0;
    
    for (i = 0; i < k + 1; i++) {
        if (y[i][j] == '\0')
            continue;
        else
            printf("%s ", y[i]);
    }
    printf ("\n");
}

int main() {
    char x[100], y[100][100], kata[100];
    printf ("Enter word:\n");
    gets(x);
 
    printf("Enter word to remove:\n");
    gets(words);
    
    remove(x, y, words);
    
    return 0;
}

我的程序输出它:

sabunkerasmaskerara

事实并非如此。也许我需要你的意见来修复这个程序,我也需要帮助让它变得更好。

标签: c

解决方案


您的解决方案不起作用,因为它用于strcmp比较字符串部分,这仅在子字符串位于字符串末尾时才有效,因为这使其以空值结尾。

您应该改为使用strstr来定位匹配项并使用memmove来移动字符串内容。

您的代码中还有其他问题:

  • 不使用gets()
  • y对于此任务是不必要的。
  • words没有定义

这是修改后的版本:

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

char *remove_all(char *str, const char *word) {
    size_t len = strlen(word);

    if (len != 0) {
        char *p = str;
        while ((p = strstr(p, word)) != NULL) {
            memmove(p, p + len, strlen(p + len) + 1);
        }
    }
    return str;
}

int main() {
    char str[100], word[100];

    printf ("Enter string:\n");
    if (!fgets(str, sizeof str, stdin))
        return 1;
 
    printf("Enter word to remove:\n");
    if (!fgets(word, sizeof word, stdin))
        return 1;
    
    word[strcspn(word, "\n")] = '\0';  // strip the trailing newline if any

    remove_all(str, word);
    
    fputs(str, stdout);

    return 0;
}

推荐阅读