使用C语言实现给字符串去重
2018-02-11 21:04
246 查看
这段时间在复习C语言编程的时候,有一位童鞋请我帮忙给他写一个字符串去重的函数,于是便花了一些时间研究了下有关于字符串去重的问题。 其实有关于C语言操作字符串,本身我感觉就是C语言的灵魂,C的存在就是为了操作内存,而不是使用C++、java等所谓高级语言的使用类似容器的操作实现去重的方法,所谓人家的接口,就是会调用就可以了,所以一些java程序员就开始各种鄙视C程序员,我觉得这是一种病态的想法,所谓术业有专攻,如是而已。 接下来就是介绍有关于程序的部分了,话不多说先上代码:
为了让编程更快一些,我没有使用自己写的strcpy,所以调用了系统的string.h库,如果有朋友需要更加细致 的程序,可以和我私聊,我可以把strlen与strcpy的自己实现的代码贡献出来。 先说代码吧,这就是一个简单的关于,字符”记忆“的用法,所谓字符记忆就是每当字符指针往后递推一位,就将上一个元素的内容纪录下来,用作比较,如果发现保留下来的上一个字符和现在指针指向的这个字符相同就说明有重复的部分,然后就将后面的指针指向的值依次向前赋值,就可以轻松实现“去重”了。 当然从理论的角度上来说还有更好的去重方法,算法嘛,以空间换时间的方法很容易就可以得出,就以这个算法为例,完全可以做成赋值式去重,代码很简单就不赘述了,大致思路就是在const char*arr在给new_arr赋值的时候,一个一个的赋值,而不是采用strcpy去做拷贝,如果发现上一个字符与arr中现在指向的值相同,就不copy了,然后直接指向下一个字符,这样也可以实现“去重”的思想。问题是在于你怎么去选择,如果传入的是const类型的变量,那么最好还是第二种,如果是传入的是非const,而且原始arr指向的也不是静态空间,就可以使用第一种做法。 但是这种做法只是实现了字符式去重,行列式去重暂时还没有想到,如果有朋友可以解答这个问题我将感激不尽: 字符串如 char*arr = "12312345674567",怎么去重得到1234567?
#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?
相关文章推荐
- C语言 编写程序实现字符串比较,不允许使用strcmp函数。
- C语言实现求字符串的长度,不使用库函数
- 【Python_Demo_1】使用Python实现C语言中sprintf()格式化字符串写入函数
- 使用C语言实现字符串中子字符串的替换
- 用C语言实现将int类型转化为字符串,不使用已有的转换函数
- 【C语言】编写一个函数reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不能使用C函数库中的字符串操作函数。
- C语言 不使用strcpy 函数实现字符串复制功能
- 【c语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数
- 使用C语言实现字符串左旋和右旋问题
- 实现C语言的拷贝函数且将复制后的字符串逆序,不能使用库函数,不能定义其他的变量。
- 使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法
- 实现C语言的拷贝函数且将复制后的字符串逆序,不能使用库函数,不能定义其他的变量。
- 【C语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。
- C语言 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。
- C语言 不使用strcat函数实现连接两个字符串功能
- 用c语言实现字符串的拷贝函数(不使用库函数)
- 使用C语言实现字符串中子字符串的替换
- c语言使用指针实现模拟java/c# string.concat字符串串联方法
- C语言:使用链表实现的可变长度字符串处理函数
- c语言实现字符串逆序