首页 > 解决方案 > C程序删除字符串中所有重复的字符

问题描述

我想从字符串中删除所有重复的字符。例如,如果我有:

“阿普鲁”

我希望结果是

阿普罗

但它显示

阿普鲁

我的错误是什么?我是初学者 请原谅我的错误

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

int main()
{
    char str[100];
    int i,j,k,n;
    gets(str);

    n = strlen(str);

    for(i=0; i<n; i++)
    {

        for(j=i+1; j<n;j++)
        {
             if(str[i] == str[j])
             {
                 str[j] = str[j+1];
             }

        }
    }

    puts(str);

    return 0;
}

标签: cstringloopsfor-loopc-strings

解决方案


该方法无效。考虑一个像char str[] = "111";.

所以在这些循环中

for(i=0; i<n; i++)
{

    for(j=i+1; j<n;j++)
    {
         if(str[i] == str[j])
         {
             str[j] = str[j+1];
         }

    }
}

str[0]等于 tp '1'str[1]也等于'1'。所以str[1]被替换为str[2]也等于 tp '1'。结果,您将得到该数组包含字符串"11"

此外,内部循环不仅处理相邻的重复字符,而且处理字符串中的所有重复字符。

请注意,该函数gets是一个不安全的函数,不再被 C 标准支持。改用标准函数fgets

该程序可以如下所示

#include <stdio.h>

int main()
{
    enum { N = 100 };
    char str[N];

    fgets( str, N, stdin );

    for ( size_t i = 0, j = 0;  str[i] != '\0'; )
    {
        if ( str[++i] != str[j] && str[i] != '\n' ) 
        {
            if ( i != ++j ) str[j] = str[i];
        }           
    }

    puts( str );

    return 0;
}

如果输入字符串"aapuroo",那么程序输出将是

apuro

if 语句中使用的子表达式str[i] != '\n'存在,因为该函数fgets可以将换行符附加到输入的字符串。所以这个子表达式用于从结果字符串中排除换行符。或者你可以在循环之前删除这个字符。


推荐阅读