Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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_Arrays_String_Loops - Fatal编程技术网

C 字符串中的重复字符

C 字符串中的重复字符,c,arrays,string,loops,C,Arrays,String,Loops,我正在编写一个代码来删除字符串中重复出现的字符 说明:-从字符串中删除重复的字符 示例:- 样本输入=abcdeabd 样本输出=abcde 我已经编写了代码,它正在工作,当我通过运行示例测试用例进行测试时,它通过了大多数测试用例,但有些测试用例失败,例如,当我将输入字符串用作“abcdabcdabcdabcdabcd”时,它将abcdd作为输出,而不是“abcd” 这是我的密码 #include<stdio.h> int main(void) { char a[

我正在编写一个代码来删除字符串中重复出现的字符

说明:-从字符串中删除重复的字符

示例:-

样本输入=abcdeabd

样本输出=abcde

我已经编写了代码,它正在工作,当我通过运行示例测试用例进行测试时,它通过了大多数测试用例,但有些测试用例失败,例如,当我将输入字符串用作“abcdabcdabcdabcdabcd”时,它将abcdd作为输出,而不是“abcd”

这是我的密码

#include<stdio.h>

int main(void)
{

        char a[60]="abcdeabd";
        int n=0;
        for(int l=0;a[l]!='\0';++l)
            ++n;
        printf("%d\n",--n);
        for(int i=0;i<=n;++i)
        {
            for(int j=i+1;j<=n;++j)
            {
                if(a[i]==a[j])
                {
                    for(int k=j;k<=n;++k)
                        a[k]=a[k+1];
                    --n;

                 }    
            }    
        }
      puts(a); 
  return 0;      
}
#包括
内部主(空)
{
字符a[60]=“abcdeabd”;
int n=0;
对于(int l=0;a[l]!='\0';++l)
++n;
printf(“%d\n”,--n);

对于(inti=0;i对于我,我将使用指针编写相应的函数

#include <stdio.h>

char * unique( char *s )
{
    char *last = s, *current = s;

    do
    {
        char *t = s;
        while ( t != last && *t != *current ) ++t;
        if ( t == last )
        {
            if ( last != current ) *last = *current;
            ++last;
        }
    } while ( *current++ );

    return s;
}

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

    puts( s );
    puts( unique( s ) );

    return 0;
}
至于你的代码,我会按照下面的方式重写,考虑到你也要复制终止零

#include <stdio.h>

char *unique( char *s )
{
    int n = 0;

    while ( s[n++] != '\0' );

    printf( "%d\n", n );

    for ( int i = 0; i < n; ++i )
    {
        for ( int j = i + 1; j < n; ++j )
        {
            if ( s[i] == s[j] )
            {
                --n;
                for ( int k = j; k  < n; ++k ) s[k] = s[k+1];
            }    
         }    
    }

    return s;
}


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

    puts( s );
    puts( unique( s ) );

    return 0;
}
#包括
char*unique(char*s)
{
int n=0;
而(s[n++]!='\0');
printf(“%d\n”,n);
对于(int i=0;i
至于我,我会使用指针编写相应的函数

#include <stdio.h>

char * unique( char *s )
{
    char *last = s, *current = s;

    do
    {
        char *t = s;
        while ( t != last && *t != *current ) ++t;
        if ( t == last )
        {
            if ( last != current ) *last = *current;
            ++last;
        }
    } while ( *current++ );

    return s;
}

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

    puts( s );
    puts( unique( s ) );

    return 0;
}
至于你的代码,我会按照下面的方式重写,考虑到你也要复制终止零

#include <stdio.h>

char *unique( char *s )
{
    int n = 0;

    while ( s[n++] != '\0' );

    printf( "%d\n", n );

    for ( int i = 0; i < n; ++i )
    {
        for ( int j = i + 1; j < n; ++j )
        {
            if ( s[i] == s[j] )
            {
                --n;
                for ( int k = j; k  < n; ++k ) s[k] = s[k+1];
            }    
         }    
    }

    return s;
}


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

    puts( s );
    puts( unique( s ) );

    return 0;
}
#包括
char*unique(char*s)
{
int n=0;
而(s[n++]!='\0');
printf(“%d\n”,n);
对于(int i=0;i
逻辑错误在块中

 if(a[i]==a[j])
 {
    for(int k=j;k<=n;++k)
       a[k]=a[k+1];
    --n;
 }    

逻辑错误在块中

 if(a[i]==a[j])
 {
    for(int k=j;k<=n;++k)
       a[k]=a[k+1];
    --n;
 }    
#包括
内部主(空)
{ 
字符a[10]=“abcdeabd”;
对于(int i=0;a[i]!='\0';++i)
printf(“\n%c”,a[i]);
对于(i=0;a[i]!='\0';++i)
对于(int j=i+1;a[j]!='\0';++j)
如果(a[i]==a[j])
对于(int k=j;a[k]!='\0';++k)
a[k]=a[k+1];
第(a)款;
返回0;
}
#包括
内部主(空)
{ 
字符a[10]=“abcdeabd”;
对于(int i=0;a[i]!='\0';++i)
printf(“\n%c”,a[i]);
对于(i=0;a[i]!='\0';++i)
对于(int j=i+1;a[j]!='\0';++j)
如果(a[i]==a[j])
对于(int k=j;a[k]!='\0';++k)
a[k]=a[k+1];
第(a)款;
返回0;
}

帕特尔:你的程序是正确的。 你只错过了一件事。 使用printf()时,会减小n的值

所以在printf()之后放一行以增加它


@帕特尔:你的程序是正确的。 你只错过了一件事。 使用printf()时,会减小n的值

所以在printf()之后放一行以增加它


为了避免两个for循环,你不能对你所拥有的进行排序吗?你到底要求我做什么?如果不阅读代码,我猜你没有删除重复的最后一个字符。是的,这就是正在发生的事情:/
减小源数组本身的大小
…好吧,至少根据当前代码,你没有。这是正确的'的大小始终等于60
char
s。您不能对您拥有的内容进行排序,以避免两个for循环吗?您要求我做什么?如果不阅读代码,我猜您无法删除重复的最后一个字符。是的,就是这样:/
减小源数组本身的大小…好吧,至少根据目前的代码,你不是。它的大小总是等于60个字符。但是我对上面的代码所做的一些更改不能仅仅是为了让它工作吗…?但是我对上面的代码所做的一些更改不能仅仅是为了让它工作吗…?R sahu谢谢你,你就像一个救世主,把我从麻烦中救了出来:)谢谢一个tonR sahu谢谢一个吨人,你就像一个救世主一样来救我脱离困境:)谢谢ton@Patel:您的“n”将数组中的i和j都减少了1。发生了什么事?@Patel:您的“n”将数组中的i和j都减少了1。发生了什么事。。?
++i;