首页 > 解决方案 > 如何从字符串中删除重复的元音?

问题描述

问题:定义一个 int 函数,从字符串中删除所有连续的元音重复。该函数应返回删除的元音数量并呈现不重复的字符串。

我是 PT 所以 Vogais 是元音;Digite uma String 是写一个字符串。A String sem duplicados fica assim ' %s ' e foram retiradas %d vogais 是 没有重复的字符串是 ' %s ' 并且删除了 %d 个元音。

解释:在葡萄牙语中,我们有一些带有两个连续元音的单词,例如:coordenador、coordenação(chqrlie 示例)。但是在这个问题的背景下,应该忽略这种情况。

问题:当我测试一个像 'ooooo' 这样的字符串时,它说没有重复元音的字符串是 'oo' 并且删除了 3 个元音。但它应该是 'o' 和 4 个元音删除。另一个错误示例是“Estaa e umaa string coom duuuplicadoos”,我正在删除“Esta e uma string com duplcdos”和 8 个元音。

注意:这是一个简单的问题,因此无需复杂化。它只询问连续的重复元音。案例 'oOoO' -> 'oO' ,'abAb'->'abAb','abab' -> 'ab','aba'-> 'aba',... 在另一章 XD 中。

int Vogais(char *s) {
    if (*s == 'A' || *s == 'a' || *s == 'E' || *s == 'e'
     || *s == 'I' || *s == 'i' || *s == 'O' || *s == 'o'
     || *s == 'U' || *s == 'u') return 1;
    return 0;
}

int retiraVogaisRep(char *s) {
    int res = 0;
    for (int i = 0; i < strlen(s); i++) {
        for (int j = i + 1; s[j] != '\0'; j++) {
            if (s[i] == s[j] && Vogais(&s[j]) == 1) {
                res++;
                for (int k = j; s[k] != '\0'; k++) {
                    s[k] = s[k + 1];
                }
            }
        }
    }
    return res;
}

int main() {
    char s[38];
    printf("Digite uma String:\n");
    scanf("%[^\n]", s);
    int res = retiraVogaisRep(s);
    printf("A String sem duplicados fica assim ' %s ' e foram retiradas %d vogais.\n", s, res);
    return 0;
}

标签: c

解决方案


您的代码太复杂:此任务不需要嵌套循环,并且在缩短字符串时没有设置空终止符。

这是一个更简单的版本:

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

int retiraVogaisRep(char *s) {
    int i, j;      // use 2 running indices
    char c, last = 0;
    for (i = j = 0; (c = s[i]) != '\0'; i++) {
        if (c != last || !strchr("aeiouAEIOU", c))
            s[j++] = last = c;
    }
    s[j] = '\0';   // set the null terminator
    return i - j;  // return the number of bytes removed
}

int main() {
    char s[100];

    printf("Digite uma String:\n");

    // read the user input safely with `fgets()`
    if (!fgets(s, sizeof s, stdin))
        return 1;

    // strip the trailing newline if any
    s[strcspn(s, "\n")] = '\0';

    // remove duplicate consecutive vowels
    int res = retiraVogaisRep(s);

    printf("A String sem duplicados fica assim ' %s ' e foram retiradas %d vogais.\n", s, res);
    return 0;
}

推荐阅读