| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3333 人关注过本帖
标题:C語言 還有其他方式 做出 刪除重複?
只看楼主 加入收藏
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:31 
C語言 還有其他方式 做出 刪除重複?
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
main()
{
char A[100];
int i=0,j;
printf("input:");
gets(A);
while(i<strlen(A))
{
j=i+1;
while(j<strlen(A))
{
if(A[j]==A[i])
{
A[j]='\0';
strcat(A,A+j+1);
}
else
j++;
}
i++;
}
puts(A);
system("pause");
}
雖然跑出來是對的 有沒有其他簡單方式做出來???
搜索更多相关主题的帖子: 其他 include while strlen strcat 
2018-04-20 19:57
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:5 
程序代码:
#include<stdio.h>
#include<string.h>
void fun(char *a)
{
    char flag[127];
    memset(flag,0,sizeof (flag));  
    for(char *b=a;;(flag[*b]==0)?(*a++=*b):*b;flag[*b]++,b++);
}
int main()
{
    char str[100];
    fgets(str,100,stdin);
    str[strcspn(str,"\n")]='\0';
    fun(str);
    fputs(str,stdout);
    return 0;
}


[此贴子已经被作者于2018-4-21 13:55编辑过]

2018-04-20 22:50
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
回复 2楼 李晨经纪人
太深奧  我看不懂
2018-04-21 10:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
回复 3楼 adssc
大意就是说把字符用一个数组记录字符是否重复出现,如果出现则跳过该字符,如果没有出现则记录该字符(其实知道原理还是挺容易理解的,知道那个flag有什么用就可以了)~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-21 11:43
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:5 
str[strlen(str)-1]='\0'; // strlen 不就是以'\0'为结束符的吗?
2018-04-21 12:46
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
2楼那个代码看起来简洁,不过认真点来看还是有些值得注意的地方~

我简单说明了一下具体情况,如果有说得不到位的地方还请多多指教

程序代码:
#include<stdio.h>
#include<string.h>
//int flag[127]={0};  全局变量尽可能少用~而且全局变量由于属于静态变量,初始值已经为0,就算用也没必要再重新赋值一次0了,而且最主要的一点就是重复调用函数的时候flag没有重新清零这样就见笑了~

void fun( char* p )  //char arr[] 
{
    char flag[127]; 

    //char型已经足够储存空间了
    
    //int flag[127]={0};  有些编译器不支持这样清零,可以用for循环清零或者memset清零
    //char* a=arr,*b=arr;

    char *q=p;
   
    memset(flag,0,sizeof (flag));  

     //for(;(flag[*b]==0)?(*a++=*b):*b;flag[*b]++,b++);
     
     while ((!flag[*p])?(flag[*q++=*p++]=*p):(*p++)); 
         
     //虽然这样写形式还是有点复杂,但感觉比之前的还要简洁并且容易理解
        
     //  *a='\0';  这里末尾已经把'\0'复制进去了就不用再补'\0'了~
   
}
int main()
{
    char str[100];
    fgets(str,100,stdin);

    //str[strlen(str)-1]='\0';
    //由于缓冲区写满的时候是不含'\n'的,固当缓冲区满的时候这样会弄走了最后那个有效字符
    
    str[strcspn(str,"\n")]='\0';
    
    fun(str);    
    fputs(str,stdout);
    
    return 0;
}


自己弄那个相对于2楼也没多大改动,看看就可以了~

程序代码:
#include<stdio.h>

void fun( char* );

int main( void )
{
    char str[100];
    
    fgets(str,sizeof (str),stdin);
    
    str[strcspn(str,"\n")]='\0';
    
    fun(str);
    
    fputs(str,stdout);
    
    return 0;
}

#include<assert.h>
#include<string.h>

void fun( char* p )  
{
    char flag[127];
    
    char *q=p;
    
    assert(p);
   
    memset(flag,0,sizeof (flag));  
     
    while ((!flag[*p])?(flag[*q++=*p++]=*p):(*p++)); 
}


[此贴子已经被作者于2018-4-21 13:35编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-21 12:49
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 6楼 九转星河
以前没见过memset函数偷懒就用了int方便了。
不过学到了用strcspn函数,解决fgets的问题。我之前那个只能有效输入98个字符。
2018-04-21 13:36
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 5楼 童生
fgets用stdin时会接受'\n',再加上'\0'。我这么写能保证正确接受98位,感觉够用了。上面的那个strcspn更好,能正确接受99个字符再加上'\0'
2018-04-21 13:44
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
感謝各位大大的幫忙,但小弟沒學太多函數,所以只會基本,有些你們用的函數有些陌生,我是希望能別用函數,能做出來嗎? 謝謝各位
2018-04-21 16:52
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 9楼 adssc
不用函数的
程序代码:
#include<stdio.h>
int main()
{
    int flag[127]={0},i,j;
    char str[100];
    gets(str);
    for(i=0,j=0;i<100;++i)
    {
        if(str[i]=='\0')
            break;
        if(flag[str[i]]==0)
        {
            flag[(str[i])]++;
            str[j++]=str[i];
        }
    }
    str[j]='\0';
    puts(str);
    return 0;
}
2018-04-21 18:40
快速回复:C語言 還有其他方式 做出 刪除重複?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022119 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved