C語言之strcat函式

2021-07-17 04:05:15 字數 2129 閱讀 1388

原本以為很簡單的乙個例子,結果讓我鬱悶了乙個上午

雖然這個知識點也懂,但還是在實踐中犯了錯,乙個上午的時間,多麼痛的領悟啊

先貼上我的**:

#include#includechar *mystrcat(char *dest,const char *src)

printf("mystrcat:%s\n",mystrcat("frank","jiang");
這是我最初的**,死活就是沒有輸出。我在mystrcat函式中進行了各種改,最後通過單步除錯,發現在第二個while中程式就自動退出,程式返回值-1,異常退出。

實際上,我的mystrcat函式是沒有問題的,問題出在了呼叫語句上。

首先說明乙個知識點:c語言中,關於字串的儲存問題。字串常量是儲存在**段的,是不允許並修改的;而通過字元陣列儲存的字串是放在棧空間的,字元陣列中的單個字元都是可以被修改的。

雖然這點我也知道,但在寫呼叫語句時,完全忽略了。這行**,直接把兩個字串常量"frank"和」jiang"作為引數給了mystrcat函式,由於是常量,是不能被修改,所以每次執行到第二個while迴圈就會發生錯誤(第二個while中改變了第乙個引數)。

下面是正常呼叫的**:

/*mystrcat*/

char *p ;

char a[20]="frank";

char b="jiang";

printf("mystrcat:%s\n", mystrcat(a,"jiang"));

//printf("mystrcat:%s\n",mystrcat(a,b));

a是乙個字元陣列,儲存在棧區,是可以改變的,所以程式正常執行。因為第二個引數沒有被改變,所以使用字串常量或是字元陣列都是可以的。

另一點需要注意的是a字元陣列的長度,一定要保證它的剩餘長度能夠容納下要連線的那個字串。

如若陣列的長度不足夠長,程式雖然可以正常顯示結果,但可能帶來隱含錯誤,新寫入的字元會覆蓋字元陣列後面的儲存單元。

例一:

/*mystrcat*/

char a[3]="frank"; //會報警告

char b="jiang";

printf("%s\n",a);

printf("mystrcat:%s\n",mystrcat(a,"jiang"));

frajiang

mystrcat:frajiangjiang

分析:陣列只有三個單元,只能存放fra這三個字元,連『\0'標誌都無法存放,所以確切來說此時a[3]=」fra「只是存粹的字元陣列,根本不是字串。

而字串b在分配單元的時候就從a的結束位置開始,並且jiang的末尾被預設加上』\0'字元轉變成字串,所以第一行顯示為frajiang。列印字串的語句預設遇到字串的結束標誌『\0'結束。所以雖然a只有三個單元,但還是列印出了frajiang(實際上,此時的字串操作對於a來說是沒有意義的)。

對於第二行的輸出也不難理解,由於mystrcat中是』\0'作為字串結束標誌的,所以把frajiang作為了a中的字串,然後再和b的jiang進行連線,最終就是frajiangjiang。

主要注意的是倘如把mystrcat(a,"jiang")換做mystrcat(a,b),程式是不能正常執行的,返回錯誤**-1;原因就是a預設包含了frajiang,b是jiang,在執行連線迴圈時,會是死迴圈。

例二:

/*mystrcat*/

char a[8]="frank";

char b="jiang";

printf("%s\n",a);

printf("mystrcat:%s\n",mystrcat(a,"jiang"));

printf("%s\n",b);

frank

mystrcat:frankjiang

ng

分析:這個結果比上面的例子更好理解,a空間不足于容下兩個字串,將jiang放入a中時,占用了b的三個字元空間,分別放了n g 和『\0',所以在列印b時,只列印了ng。

原本b中的內容被覆蓋了。

c語言之strcat函式Strcpy函式

因為面試的時候經常考到,所以就自己總結了一下。注意點 為前乙個字串的空間要夠後邊字串的儲存。strcat原型為strcat char str1,const char str2 或者strcat char a,char b 作用 將str2複製到str1的末尾。或者說將b陣列裡的元素複製到a陣列元素的...

C語言 構造Strcat函式

題目 編寫函式fun,其功能是 實現兩個字串的連線 不要使用庫函式strcat 即 把p2所指的字串連線到p1所指的字串的後面。例如 分別輸入下面兩個字串 firststring secondstring 程式輸出 firststring secondstring 編譯環境 vs2010 inclu...

c語言 實現Strcat函式

實現char my strcat char dest,char src 函式.返回 dest字串的位址。功能 將src指向的字串追加到dest指向字串的後面。例如 char dest 10 andef char src ghi my strcat 之後,dest指向的字串為 andefghi inc...