前兩天需要用到字串數組,需要動態增加和減少,類似於java裡的ArrayList<String>提供的功能,但C裡又沒有現成的庫和函數,所以就自己動手寫了一個。
廢話也不多說了,可能會有朋友需要,所以這裡直接把代碼貼出來:
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct{ unsigned int size; //子字串數量 char **list; //用字串數組來存放字串列表}st_strlist;/* * 初始化一個字串列表 * 注意:strlist_malloc() 和 strlist_free(st_strlist*) 要配對使用 */st_strlist* strlist_malloc(){ st_strlist *strlist = (st_strlist*)malloc(sizeof(st_strlist)); memset(strlist, 0, sizeof(st_strlist)); return strlist;}/* * 在strlist列表的末端增加一個字串 */int strlist_add(st_strlist *strlist, char *str){ int len = strlen(str); strlist->size++; strlist->list = (char**)realloc(strlist->list, sizeof(char*) * strlist->size); if(strlist->list == NULL){ /* out of memory! */ printf("error: not enough memory (realloc returned NULL)\n"); return -1; } strlist->list[strlist->size-1]=(char*)malloc(len+1); memcpy(strlist->list[strlist->size-1], str, len); (strlist->list[strlist->size-1])[len]=0; return strlist->size;}/* * 在字串列表的index序號後插入str字串 */int strlist_insertAfter(st_strlist *strlist, char* str, unsigned int index){ int i, len; if(index >= strlist->size){ return -1; } len = strlen(str); strlist->size++; strlist->list = (char**)realloc(strlist->list, sizeof(char*) * strlist->size); if(strlist->list == NULL){ /* out of memory! */ printf("error: not enough memory (realloc returned NULL)\n"); return -1; } for(i= strlist->size-1; i>index+1; i--){ strlist->list[i] = strlist->list[i-1]; } strlist->list[index+1] = (char*)malloc(len+1); memcpy(strlist->list[index+1], str, len); strlist->list[index+1][len]=0; return 0;}/* * 刪除字串列表strlist末端的字串 */int strlist_removeLast(st_strlist *strlist){ if(strlist->size <=0){ return -1; } free(strlist->list[strlist->size-1]); strlist->size--; return strlist->size;}/* * 刪除字串列表index位置處的字串 */int strlist_removeAt(st_strlist *strlist, unsigned int index){ int i; if(index >= strlist->size){ return -1; } free(strlist->list[index]); for(i=index; i< strlist->size-1; i++){ strlist->list[i] = strlist->list[i+1]; } strlist->size--; return strlist->size;}/* * 擷取strlist中index處的字串。 */char* strlist_getStrAt(st_strlist *strlist, unsigned int index){ if(strlist==NULL || index>=strlist->size){ return NULL; } return strlist->list[index];}/* * 判斷字串列表strlist內是否包含了字串str。 */int strlist_contains(st_strlist *strlist, char* str){ int i; for(i=0; i<strlist->size; i++){ if(0 == (strcmp(strlist->list[i], str))){ return 1; } } return 0;}/* * 釋放字串列表佔用的記憶體空間 */int strlist_free(st_strlist *strlist){ int i; if(!strlist){ return -1; } for(i=0; i<strlist->size; i++){ free(strlist->list[i]); } free(strlist->list); free(strlist); return 0;}/* * 列印字串列表的相關資訊 */void strlist_infolog(st_strlist *strlist){ int i; printf("\n>>>\n"); printf("strlist info:\n"); printf("strlist size: %d\n", strlist->size); for(i=0; i<strlist->size; i++){ printf("%d, %s\n",i, strlist->list[i]); }}int main(int argc, char *argv[]){ printf("hello c_strlist!"); st_strlist *strlist = strlist_malloc(); strlist_infolog(strlist); strlist_add(strlist,(char*)"aaaa"); strlist_infolog(strlist); strlist_add(strlist,(char*)"bbbb"); strlist_infolog(strlist); strlist_add(strlist,(char*)"字串列表測試"); strlist_infolog(strlist); strlist_insertAfter(strlist, (char*)"ccccc", 1); strlist_infolog(strlist); printf("\nis strlist contians \"123\"? %d\n", strlist_contains(strlist,(char*)"123")); printf("\nis strlist contians \"字串列表測試\" ? %d\n", strlist_contains(strlist,(char*)"字串列表測試")); strlist_removeLast(strlist); strlist_infolog(strlist); printf("\nis strlist contians \"字串列表測試\" ? %d\n", strlist_contains(strlist,(char*)"字串列表測試")); strlist_removeAt(strlist,1); strlist_infolog(strlist); strlist_free(strlist); return 0;}/*************************** 輸出結果:hello c_strlist!>>>strlist info:strlist size: 0>>>strlist info:strlist size: 10, aaaa>>>strlist info:strlist size: 20, aaaa1, bbbb>>>strlist info:strlist size: 30, aaaa1, bbbb2, 字串列表測試>>>strlist info:strlist size: 40, aaaa1, bbbb2, ccccc3, 字串列表測試is strlist contians "123"? 0is strlist contians "字串列表測試" ? 1>>>strlist info:strlist size: 30, aaaa1, bbbb2, cccccis strlist contians "字串列表測試" ? 0>>>strlist info:strlist size: 20, aaaa1, ccccc************************/