1. 程式人生 > >練習 5-3 用指標實現函式strcat(s,t)將t指向的字串複製到s指向的字串的尾部。

練習 5-3 用指標實現函式strcat(s,t)將t指向的字串複製到s指向的字串的尾部。


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;
}