您的位置:首页 > 编程语言 > C语言/C++

使用C语言实现给字符串去重

2018-02-11 21:04 246 查看
        这段时间在复习C语言编程的时候,有一位童鞋请我帮忙给他写一个字符串去重的函数,于是便花了一些时间研究了下有关于字符串去重的问题。       其实有关于C语言操作字符串,本身我感觉就是C语言的灵魂,C的存在就是为了操作内存,而不是使用C++、java等所谓高级语言的使用类似容器的操作实现去重的方法,所谓人家的接口,就是会调用就可以了,所以一些java程序员就开始各种鄙视C程序员,我觉得这是一种病态的想法,所谓术业有专攻,如是而已。       接下来就是介绍有关于程序的部分了,话不多说先上代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* decreaseInMass(const  char * arr)
{
int arr_l = strlen(arr);
char*new_arr = (char*)malloc(arr_l + 1);
if (new_arr == NULL)return NULL;
memset(new_arr, 0, arr_l + 1);
strcpy(new_arr, arr);
char* tmp = new_arr;
char tmp_c = new_arr[0];
for(int i =1;i<arr_l;i++)
{
int j = i;
printf("%d\n", j);
if (tmp_c == tmp[i])
{
char*tmp2 = tmp + i;
while(*tmp2 !='\0')
{
*tmp2 = *(tmp2 + 1);
tmp2++;
}
i--;
arr_l--;
printf("%s\n", new_arr);
}
else
{
tmp_c = new_arr[i];
}
}
return new_arr;
}
int main(int argc,char**argv)
{
char*arr = "0012344566788899999999999";
char*new_arr = decreaseInMass(arr);
printf("%s\n", new_arr);
system("pause");
return 0;
}


        为了让编程更快一些,我没有使用自己写的strcpy,所以调用了系统的string.h库,如果有朋友需要更加细致 的程序,可以和我私聊,我可以把strlen与strcpy的自己实现的代码贡献出来。        先说代码吧,这就是一个简单的关于,字符”记忆“的用法,所谓字符记忆就是每当字符指针往后递推一位,就将上一个元素的内容纪录下来,用作比较,如果发现保留下来的上一个字符和现在指针指向的这个字符相同就说明有重复的部分,然后就将后面的指针指向的值依次向前赋值,就可以轻松实现“去重”了。        当然从理论的角度上来说还有更好的去重方法,算法嘛,以空间换时间的方法很容易就可以得出,就以这个算法为例,完全可以做成赋值式去重,代码很简单就不赘述了,大致思路就是在const char*arr在给new_arr赋值的时候,一个一个的赋值,而不是采用strcpy去做拷贝,如果发现上一个字符与arr中现在指向的值相同,就不copy了,然后直接指向下一个字符,这样也可以实现“去重”的思想。问题是在于你怎么去选择,如果传入的是const类型的变量,那么最好还是第二种,如果是传入的是非const,而且原始arr指向的也不是静态空间,就可以使用第一种做法。         但是这种做法只是实现了字符式去重,行列式去重暂时还没有想到,如果有朋友可以解答这个问题我将感激不尽:        字符串如       char*arr = "12312345674567",怎么去重得到1234567?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐