2013-01-04 45 views
0

我對C相當陌生,我試圖編寫一個簡單的程序來連接兩個字符串。雖然在我的Linux機器上運行它,我得到以下異常:這個基本的strcat實現有什麼問題?

test.c的:12:10:錯誤:衝突的類型「strcat的」

能否請你幫我明白我是缺少在這裏:

#include<stdio.h> 
#include<string.h> 

void main() { 
    // string concatenation 
    char str1[] = {'S', 'h'}; 
    char str2[] = {'X', 'y'}; 
    strcat(str1, str2); 
} 

void strcat(char str1[], char str2[]) { 
    int index; 
    int str1_length = strlen(str1); 
    for(index=0; index<strlen(str2); index++) { 
    str1[index + str1_length] = str2[index]; 
    } 
} 
+0

只是刪除'string.h',還有另外一個'strcat'實施存在於'string.h' –

+0

@AdeelAhmed他需要的strlen – 2013-01-04 06:22:47

+0

然後更換'其他一些相似的名字strcat' string.h中 –

回答

1

string.h已經提供了strcat所以只重命名功能到別的東西。

1

string.h庫中已定義一個strcat函數,其簽名爲char *strcat(char *Destination, char *Source);。您的用戶定義的功能與它衝突。由於C不支持重載,您需要重命名您的函數。

在連接之前,還必須聲明目標char數組,以便它有足夠的空間來容納連接的字符串。如果沒有,你會運行數組綁定,這可能會導致奇怪的問題。

另外,你的字符串應該是空終止的,因爲標準庫依賴於它來確定字符串結束的位置。如果沒有空終止符,strlen無法計算出字符串長度(除非意外,下一個內存位置碰巧有一個NULL字符 - 你不應該依賴這種事故)。

5

strcat沒有standard signature

char *strcat(char *dest, const char *src); 

你需要做,如果你想包括string.h與之相匹配。或者,只要給你的實現一個不同的名稱(例如my_strcat)。

你可能也會想要終止你的測試字符串 - 那些strlen調用會給你非常有趣的結果,否則。另外,爲避免寫入超過第一個字符串的分配內存的末尾(從而導致未定義的行爲),請確保給它足夠的空間以適合第二個字符串的末尾。

1

您的函數不能在string.h中聲明該名稱。只需將你的函數重命名爲myStrcat或者其他類型的東西。

1

更換strcatstr_cat,因爲你的函數名稱與功能已經存在除了別人談到的名稱衝突發生衝突在string.h

#include<stdio.h> 
#include<string.h> 

void main() { 
    // string concatenation 
    char str1[] = {'S', 'h'}; 
    char str2[] = {'X', 'y'}; 
    str_cat(str1, str2); 
} 

void str_cat(char str1[], char str2[]) { 
    int index; 
    int str1_length = strlen(str1); 
    for(index=0; index<strlen(str2); index++) { 
    str1[index + str1_length] = str2[index]; 
    } 
} 
+0

實際上,以'str'開頭的函數名稱後跟一個小寫字母的名稱空間是保留的,所以不要這樣做。 – unwind

2

,也沒有適當的字符串。

在C中,字符串以空終止符結尾(\0)。

你讓你的字符串是這樣的:

char str1[] = {'S', 'h'}; 

所以它只有兩個字符,S和h。

要使字符串可用於諸如strlen之類的函數,它必須具有空終止符。
我建議:

char str1[] = {'S', 'h', '\0'}; 
2

有預定義的函數「strcat的」 C語言(string.h中),所以當你試圖調用strcat的那麼編譯器似乎inbuild功能和您定義的函數之間的衝突。所以最好重命名你的strcat函數。

0

只要改變你的代碼如下:

replace char str1[] = {'S', 'h'} by char str1[] = {'S', 'h', '\0'}; 
replace char str2[] = {'X', 'y'} by char str2[] = {'X', 'y', '\0'}; 
2

有在你的代碼中的許多錯誤。首先,字符串str1和str2應該以null結尾。你可以通過改變它們的聲明更正,以

char str1[] = {'S', 'h', '\0'}; 
char str2[] = {'X', 'y', '\0'}; 

其次,strcat是保留名稱,所以你的主要功能不打電話給你的版本,但是這是版本發現在頭文件<string.h>。您可以通過重命名您的功能或通過不包含標頭string.h來更正此問題。如果你做第二個,你也應該實現功能strlen,因爲它在string.h找到。

+0

感謝您的評論。後續問題:如果我將字符串寫爲: char str1 [] =「Sh」; C編譯器是否自動添加'\ 0'字符來終止它? –

+0

「所以你的主要功能不會調用你的版本」......這個*可以是真實的,但不適用於大多數已知的實現。 「在頭文件上找到的版本」 - string.h中沒有strcat的版本,只是一個聲明。 –

+0

@ user721998是的,這就是爲什麼推薦你使用它而不是char str [] = {...},這有時會引起誤解。 –

0
#include<stdio.h> 
#include<string.h> 

void mystrcat(char str1[], char str2[]); 

void main() { 
char str1[] = {'S', 'h' , '\0'}; 
char str2[] = {'X', 'y', '\0'}; 
mystrcat(str1, str2); 
} 

// string concatenation 
void mystrcat(char str1[], char str2[]) { 
int index; 
int str1_length = strlen(str1); 
for(index=0; index<strlen(str2); index++) { 
    str1[index + str1_length] = str2[index]; 
} 
str1[index + str1_length] = '\0'; 
printf("%s\n",str1); 
}