字符串在c語言裏還是常用,存儲方式有三種:定長順序存儲、堆分配存儲、塊鏈存儲
定長順序存儲:即數組,有固定的長度,不可改變。
堆分配存儲:可以改變長度,用動態數組來存儲
塊鏈存儲:用鏈表來存儲字符串
1、定長順序存儲,需要預先知道要存儲的字符串的長度,事先分配數組大小。
2、堆分配存儲,需要手動malloc分配空間,使用後要用free釋放空間。可以改變數組大小,改變方法用realloc函數
以下例子是把a2數組追加到a1數組中
#include <stdio.h>
int main(int argc,char*argv[]){
char *a1 = (char*)malloc(5*sizeof(char)); //創建了一個數組a1,分配空間大小是5
char *a2 = (char*)malloc(5*sizeof(char));
strcpy(a1,"helo"); //把內容放進內存空間。不能用等號賦值
strcpy(a2,"word");
int a1len = strlen(a1);
int a2len = strlen(a2);
if(a1len < a2len + a1len){
a1 = (char*)realloc(a1,(a1len + a2len)*sizeof(char)); //擴展數組a1的大小
}
for(int i=a1len; i<a1len+a2len; i++){
a1[i] = a2[i-a1len];
}
a1[a1len + a2len] = '\0'; //最後一個字符爲結束符
printf("a1 = %s\n",a1);
free(a2); //釋放空間
free(a1);
}
3、塊鏈存儲,可以是單鏈表,雙鏈表具體根據需要來。以下用單鏈表來舉例。
鏈表的每一個節點可以存儲一個字符,也可以存儲多個字符,具體要存儲多少個字符需要根據實際情況來。
#include <stdio.h>
#define LINK_NUM 3 //每個節點存儲的字符數
typedef struct Link{
char str[LINK_NUM];
struct Link *next;
}link;
link * initLink(link *head, char *str){
link *node= NULL;
link *tmp = NULL;
for(int i = 1; i<strlen(str)/LINK_NUM +2; i++){ //計算出一共要創建多少個節點
node = (link*)malloc(sizeof(link)); //創建新節點
for(int j = 0;j<LINK_NUM;j++){
node->str[j]=str[(i-1)*LINK_NUM+j];
if((i-1)*LINK_NUM+j >= strlen(str)){
node->str[j]= '#'; //最後一共節點多出來的用#填充
}
if((i-1)*LINK_NUM+j == 0){ //第一個節點
head = node;
tmp = head;
}
}
node->next = NULL;
tmp ->next= node;
tmp = node;
}
return head;
}
void showLink(link *head){
link *tmp = head;
do{
printf("%s",tmp->str);
tmp = tmp -> next;
}while(tmp != NULL);
printf("\n");
}
int main(int argc,char*argv[]){
link *head = NULL;
head = initLink(head,"data.biancheng.n");
showLink(head);
return 0;
}