練習 5-3 用指標實現函式strcat(s,t)將t指向的字串複製到s指向的字串的尾部。
阿新 • • 發佈:2019-02-10
1. 首先想到就是的將字串s迴圈到‘\0’的前一個字元,然後將字串t的地址給此時的s地址。
兩個問題:
①這種s=t,是不對的,只是拷貝了指標,並沒有進行字串的複製?
②當執行語句 while(*s++);時,此時 *s='\0', 所以後面應該s--;或者這樣寫 while(*s) s++;
③ 注意呼叫mystrcat(s,t)時 ,不能定義為字串常量(不能修改)
例: char str[ ]="hello";
不能定義為 char *str="hello".
char* mystrcat(char* s, char* t)
{
char* p;
p = s;
while (*s++)
;
s = t; //不能將 字串str2的首地址給 嗎? 這樣只拷貝了指標。
return p;
}
int main()
{
//char *str1 = "hello"; 字串常量 不能修改
char str1[] = "hello";
char* str2 = "world";
printf("%s", strcat(str1, str2));
return 0;
}
2 .
//from answer book char* strcat(char* s, char* t) { char* p; p = s; while (*s) s++; while (*s++ = *t++) ; return p; }
3.利用strcpy來實現。
//利用 strcpy函式來實現
char* strcat3(char* dest, char* src)
{
char* p = dest;
strcpy(dest+ strlen(dest), src);
return p;
}
4.看到一道筆試題,編寫strcat函式,最後問strcat能把strSrc的內容連線到strDest,為什麼還要char
*型別的返回值?
不明白講的什麼意思?
5. 注意以下程式碼:
此外,注意如下程式碼: char *Func(void) { char str[] = "hello world"; return str; //return語句不可返回指向“棧記憶體”的“指標”,因為該記憶體在函式體結束時被自動銷燬。 } char *Func(void) { char *pstr = "hello world";//字串常量存放在靜態區 return pstr; }
後來在網上看了別人部落格,理解了一些,比如下面一段程式碼。
返回指標時,下面的程式碼會出現問題。
解析:之前在別的地方看到一個很形象的解釋,就是你去旅遊,覺得當地的一家酒店的飯菜很有特色,於是就記下了它的地址門牌號之類的(相當於指標),當你回去之後,也就是函式呼叫完畢,返回這個指標是沒有問題的,你回去之後是依然可以看這個地址門牌號的,但是當一段時間再去上次旅遊的地方,可能那家酒店已經不存在了,可能變成了一家理髮店或者其他什麼的
所以,當函式呼叫結束,指標所指向的內容是存放在棧的,會隨著函式一起銷燬的,但是指標還是存在的,只不過此時指標指向的內容不確定,所以結果是會出錯的。
include <stdio.h>
char*GetMemory(void)
{
char p[]="hello world"; //
return p;
}
int main(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
return 0;
}
但是通過其他方法我們可以避免對指標返回的錯誤
比如延長指標的生命期,將其設定為靜態變數,使其生命期延長至整個檔案
或者設定成一個字串的常量,讓其存放在靜態區中也是可以的
實現的程式碼如下
#include <stdio.h>
char *GetMemory(void)
{
static char p[]="hello world";
return p;
}
int main(void)
{
printf("%s\n",GetMemory());
return 0;
}
或 改為這樣
#include <stdio.h>
char *GetMemory(void)
{
char *p="hello world";
return p;
}
int main(void)
{
printf("%s\n",GetMemory());
return 0;
}