Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以使用C中的指针删除字符串中的重复字符?_C - Fatal编程技术网

有没有一种方法可以使用C中的指针删除字符串中的重复字符?

有没有一种方法可以使用C中的指针删除字符串中的重复字符?,c,C,我的老师要求使用具有以下特征的C函数: int removeVowels(char *s) { ... } 输入(示例):“Estaa e umaa string coom duuuplicadoos” 输出:“Esta e uma string com duplicados” 程序还应输出删除的字母数 我们将不胜感激 尝试: int aux[1000]; int i = 0; int retiraVogaisRep (char *s){ if (*s == '\0'

我的老师要求使用具有以下特征的C函数:

int removeVowels(char *s)
{
    ...
}
  • 输入(示例):“Estaa e umaa string coom duuuplicadoos”

  • 输出:“Esta e uma string com duplicados”

程序还应输出删除的字母数

我们将不胜感激

尝试:

int aux[1000];
int i = 0;

int retiraVogaisRep (char *s){
    if (*s == '\0'){
        return 0;
    }
    else{
        if ((*s == 'A' || *s == 'E' || *s == 'I' || *s == 'O' || *s == 'U' || *s == 'a' || *s == 'e' || *s == 'i' || *s == 'o' || *s == 'u') && aux[i] != *s){
            i++;
            aux[i] = *s;
            return retiraVogaisRep(s + 1);
        }
        else if ((*s == 'A' || *s == 'E' || *s == 'I' || *s == 'O' || *s == 'U' || *s == 'a' || *s == 'e' || *s == 'i' || *s == 'o' || *s == 'u') && aux[i] == *s){
            i++;
            aux[i] = *s;
            *s = '';
            return 1 + retiraVogaisRep(s + 1);
        }
        else{
            return retiraVogaisRep(s + 1);
        }
    }
}
Attemp 2(有效,但有更简单的方法吗?):

charfinal[1000];
char-aux[1000];
int k=0;
int i=0;
int y=0;
int retiraVogaisRep(字符*s){
如果(*s=='\0'){
while(k=0){
*(s-i)=最终[1000];
我--;
}
返回0;
}
否则{
如果(*s='A'| |*s='E'| |*s='I'| |*s='O'|*s='U'|*s='A'| |*s='E'| |*s='I'|*s='O'| |*s='U'|和aux[I]!*s){
i++;
辅助[i]=*s;
最终[y]=*s;
y++;
返回RetravogaisRep(s+1);
}
如果(*s='A'| |*s='E'| |*s='I'|*s='O'|*s='U'|*s='A'| |*s='E'| |*s='I'| |*s='O'| | s='U'){
i++;
辅助[i]=*s;
返回1+retravogaisremp(s+1);
}
否则{
最终[y]=*s;
y++;
i++;
返回RetravogaisRep(s+1);
}
}
}
int是元音(char-ch)
{
if(ch>='A'&&ch
int是元音(char-ch)
{

如果(ch>='A'&&ch这是一种可能的解决方案:

    int removeVowels(char *s)
    {
        char *src = s;
        char *dst = s;

        while (*dst != '\0')
        {
            switch (* ++ src)
            {
            case 'A': case 'a':
            case 'E': case 'e':
            case 'I': case 'i':
            case 'O': case 'o':
            case 'U': case 'u':
                if (* src != * dst)
                    * ++ dst = * src;
                break;

            default:
                * ++ dst = * src;
                break;
            }
        }

        return src - dst;
    }
首先,输入字符串的第一个字符是输出字符串的第一个字符——即使是元音,也肯定不是重复的

然后我们进入一个循环。循环将一直工作,直到结果字符串终止——因此,当
dst
指针指向的字符不是零时,进行迭代

在每次迭代中,我们推进
src
指针并获取指向的字符。如果它是元音,我们测试它是否与最近接受的输出字符(由
dst
指向)相同;如果是,我们跳过它,否则我们将它附加到结果中(通过推进
dst
指针并复制字符)

如果这个字符不是元音,我们就复制它,没有更多的条件

一旦
src
指针到达字符串的末尾,就会复制零字节(字符串终止符),并退出循环

此时,
src
指向源字符串的末尾,
dst
指向结果字符串的末尾(该字符串从源字符串开始的同一点开始,但现在可以比源字符串短)。
因此,指针
src-dst
的区别正是跳过的字符数(元音)


请在此处尝试:

这是一种可能的解决方案:

    int removeVowels(char *s)
    {
        char *src = s;
        char *dst = s;

        while (*dst != '\0')
        {
            switch (* ++ src)
            {
            case 'A': case 'a':
            case 'E': case 'e':
            case 'I': case 'i':
            case 'O': case 'o':
            case 'U': case 'u':
                if (* src != * dst)
                    * ++ dst = * src;
                break;

            default:
                * ++ dst = * src;
                break;
            }
        }

        return src - dst;
    }
首先,输入字符串的第一个字符是输出字符串的第一个字符——即使是元音,也肯定不是重复的

然后我们进入一个循环。循环将一直工作,直到结果字符串终止——因此,当
dst
指针指向的字符不是零时,进行迭代

在每次迭代中,我们推进
src
指针并获取指向的字符。如果它是元音,我们测试它是否与最近接受的输出字符(由
dst
指向)相同;如果是,我们跳过它,否则我们将它附加到结果中(通过推进
dst
指针并复制字符)

如果这个字符不是元音,我们就复制它,没有更多的条件

一旦
src
指针到达字符串的末尾,就会复制零字节(字符串终止符),并退出循环

此时,
src
指向源字符串的末尾,
dst
指向结果字符串的末尾(该字符串从源字符串开始的同一点开始,但现在可以比源字符串短)。
因此,指针
src-dst
的区别正是跳过的字符数(元音)

在这里试试:

其他答案(在发布本文时有两个)都提供了优秀(和高效)的解决方案。在这里,我提供了另一个–效率较低,但希望更简单、更清晰

首先,让我们定义一个函数来测试一个字符是否是元音你得到了很长的“丑陋”行或代码块,然后你应该考虑把代码移到一个函数中。你永远不知道什么时候你可能需要它,如果你这样做了,那么它已经是一个已经完成的契约。
int是元音(charc)
{
静态字符*元音=“AEIOUaeiou”;//使此“静态”只会导致初始化一次
//静态字符*元音=“AEIOUWYaeiouwy”//威尔士人的选择!
for(char*cp=元音;*cp;++cp){
如果(c==*cp)返回1;//匹配一个元音,我们可以返回而不需要进一步循环
}
返回0;//循环已完成,但不匹配,因此它不是元音
}
接下来是删除重复元音的函数。此版本只需在给定字符串中运行一个简单的循环,如果不满足删除条件,则将“源”复制到“目标”。我们可以通过覆盖字符串本身来安全地执行此操作,因为我们永远不需要“返回”并多次查看原始字符串中的字符

另外,请注意,我们将用字符本身覆盖字符,直到我们找到至少一个要跳过的字符——但这是一种牺牲一点效率来保持代码简单性的情况。在其他一些地方,向代码添加一些复杂性也会使其更有效……我将把这些作为谚语“为读者做练习!”

int-remove元音(char*strin)