使用C語言實現給字串去重
阿新 • • 發佈:2019-02-17
這段時間在複習C語言程式設計的時候,有一位童鞋請我幫忙給他寫一個字串去重的函式,於是便花了一些時間研究了下有關於字串去重的問題。 其實有關於C語言操作字串,本身我感覺就是C語言的靈魂,C的存在就是為了操作記憶體,而不是使用C++、java等所謂高階語言的使用類似容器的操作實現去重的方法,所謂人家的介面,就是會呼叫就可以了,所以一些java程式設計師就開始各種鄙視C程式設計師,我覺得這是一種病態的想法,所謂術業有專攻,如是而已。 接下來就是介紹有關於程式的部分了,話不多說先上程式碼:
為了讓程式設計更快一些,我沒有使用自己寫的strcpy,所以呼叫了系統的string.h庫,如果有朋友需要更加細緻 的程式,可以和我私聊,我可以把strlen與strcpy的自己實現的程式碼貢獻出來。 先說程式碼吧,這就是一個簡單的關於,字元”記憶“的用法,所謂字元記憶就是每當字元指標往後遞推一位,就將上一個元素的內容紀錄下來,用作比較,如果發現保留下來的上一個字元和現在指標指向的這個字元相同就說明有重複的部分,然後就將後面的指標指向的值依次向前賦值,就可以輕鬆實現“去重”了。 當然從理論的角度上來說還有更好的去重方法,演算法嘛,以空間換時間的方法很容易就可以得出,就以這個演算法為例,完全可以做成賦值式去重,程式碼很簡單就不贅述了,大致思路就是在const char*arr在給new_arr賦值的時候,一個一個的賦值,而不是採用strcpy去做拷貝,如果發現上一個字元與arr中現在指向的值相同,就不copy了,然後直接指向下一個字元,這樣也可以實現“去重”的思想。問題是在於你怎麼去選擇,如果傳入的是const型別的變數,那麼最好還是第二種,如果是傳入的是非const,而且原始arr指向的也不是靜態空間,就可以使用第一種做法。 但是這種做法只是實現了字元式去重,行列式去重暫時還沒有想到,如果有朋友可以解答這個問題我將感激不盡: 字串如
#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?