星期六, 5月 10, 2008

String (C語言)

請看以下的程式:
#include
#include
main(){
char *s3="Welcome";
char *s5="Good morning";
s3=s5;
printf("s3=%s\n",s3);
printf("s5=%s\n",s5);
s5="123";
printf("s3=%s\n",s3);
system("PAUSE");
return 0;
}
我們一行一行看...
char *s3="Welcome";
char *s5="Good morning";
s3與s5 沒有配置記憶體空間,"Welcome"與"Good morning"
算是編譯器在編譯期間就決定字串的位址,並沒有真正一塊記憶體
存放 "Welcome" & "Good morning"。
s3=s5;
上面這一行的意思是s3將指標指向的位址指向s5現在指向的位址
,也就是s3指標會指向 "Good morning"這一個字串位址。
s5="123";
上面這一行因為 "123"沒有記憶體空間,所以把 s5 改成 "123",
而s3 還是不變,也就是說s5指標指向 "123"這個字串的記憶體位置。
所以並沒有修改原有字串的內容。

指標要用 malloc 先配置記憶體,才可以在改變存在 malloc 產生的記憶體裡面的字串。
若是要進行字串複製動作,c與c++內不是使用=來指定,而是使用 strcpy()。
例如:
#include
#include
main(){
char s8[]="Good morning";
printf("s8=%s\n",s8);
strcpy(s8,"this is a testing");
printf("s8=%s\n",s8);
system("PAUSE");
return 0;
}

不過下面的複製字串寫法會有問題的,因為 s3是指標但是沒有指向任何合法
可提供寫入的記憶體內。
#include
#include
main(){
char *s3="Good morning";
printf("s3=%s\n",s3);
strcpy(s3,"this is a testing");
printf("s3=%s\n",s3);
system("PAUSE");
return 0;
}

所以常用的方式就是將指標指向合法可用的記憶體區段內再來存取,
使用 malloc() 配置記憶體提供使用:
區段內都可以解決。
#include
#include
main(){
char *s3=(char *) malloc(sizeof(char) * 100);
strcpy(s3,"this is a testing");
printf("s3=%s\n",s3);
system("PAUSE");
return 0;
}

指向其他可以寫入的記憶體:
#include
#include
main(){
char *s3;
char s8[]="Good morning";
s3="Welcome";
printf("s3=%s\n",s3);
printf("s8=%s\n",s8);
s3 = s8;
strcpy(s3,"this is a testing");
printf("s8=%s\n",s8);
printf("s3=%s\n",s3);
system("PAUSE");
return 0;
}


綜合以上的說明,如果是兩個指標,可以用以下的方修改字串資料:

#include
#include
main(){
char *s3,*s5;
s3=malloc(10 * sizeof(char));
strcpy(s3,"Welcome");
s5=malloc(15 * sizeof(char));
strcpy(s5,"Good morning");
printf("first s3=%s\n",s3);
printf("first s5=%s\n",s5);
s3=s5;
printf("second s3=%s\n",s3);
printf("second s5=%s\n",s5);
strcpy(s5,"123");
printf("third s3=%s\n",s3);
printf("third s5=%s\n",s5);
system("pause");
return 0;
}

沒有留言:

張貼留言