[英]construct my own strcat function with arrays in c
我正在嘗試編寫一個類似於strcat的函數,編譯代碼時沒有出現任何錯誤。 問題是在調用函數時,它沒有將第二個數組中的元素附加到第一個數組中。 當我打印第一個數組時,它仍然相同。 有什么建議嗎?
#include <stdio.h>
#include <string.h>
char *strcat1(char *dest, char *src);
char *strcat1(char *dest, char *src) {
int i;
int j;
printf("i0=%d, j0=%d\n", i, j);
i = strlen(dest);
j = strlen(src);
for (int z = 0; z < j; z++) {
dest[z + i + 1] = src[z];
}
}
int main() {
char str1[100];
char str2[30];
printf("put the first string:\n");
fgets(str1, sizeof(str1), stdin);
printf("\ninput the second string\n");
fgets(str2, sizeof(str2), stdin);
strcat1(str1, str2);
printf("%s", str1);
}
str1以'\\ 0'結尾。
strlen返回不包括終止空字符的字符串長度。
因此,例如,如果string為“ toto”,則strlen(string)為4。
在記憶中 :
string[0] = 't'
string[1] = 'o'
string[2] = 't'
string[3] = 'o'
string[4] = '\0'
但是您在dest [z + i + 1]上進行寫作,因此在我的示例中。 字符串[z + 4 +1]是字符串[5]。 因此,在'\\ 0'之后。
結果將是:“ toto \\ 0string2”。
但是由於printf%s停止讀取\\ 0處的指針,因此只能看到“ toto”。
嘗試更換
dest[z+i+1]
通過
dest[z+i]
到目前為止,給出的答案有些混亂。 這是因為fgets
讀取的字符串不僅以null character
結尾,而且還包含LINE_FEED
字符。
1)應對
dest[z+i+1]=src[z];
必須執行為:
dest[z+i-1] = src[z];
消除' \\n' == 0x0A
或將'\\n'
保留為:
dest[z+i] = src[z];
2)我們還必須正確終止連接的字符串。
知道i
和j
考慮了'\\ n'個字符,我們必須相應地終止字符串:
dest[i+j] = '\0' ;
3)在C90中,原型為:
char *strcat(char *dest, const char *src);
strcat()
函數應返回指針dest
; 該函數沒有故障模式,也沒有錯誤返回。
改進的程序:
#include <stdio.h>
#include <string.h>
char* strcat1(char* dest, const char* src);
char* strcat1(char* dest, const char* src){
size_t i;
size_t j;
size_t z;
i = strlen(dest); // Note: '\n' is included in the length count
j = strlen(src); // Note: '\n' is included in the length count
printf("i0=%zu, j0=%zu %X\n ", i, j, src[j-1] );
for(z=0; z < j; z++){
dest[z+i] = src[z];
}
dest[i+j] = '\0' ;
return dest;
}
int main(void){
char str1[100];
char str2[30];
printf("put the first string:\n");
fgets(str1, sizeof(str1), stdin);
printf("\ninput the second string\n");
fgets(str2, sizeof(str2), stdin);
strcat1(str1,str2);
printf("\n%s", str1);
return 0;
}
輸出:
put the first string:
1234
input the second string
567890
i0=5, j0=7 A
1234
567890
您的strcat1
函數有一些問題:
原型應該是char *strcat1(char *dest, const char *src);
因為該函數不會修改源字符串。
字符應該以偏移量z + i
復制到dest
數組中。 當前,您在空終止符之后復制源字符串,因此在復制后打印目標數組時,什么也不會出現。
您還必須復制空終止符,以確保目標數組正確終止。
您必須將指針返回到目標數組。
索引變量的類型應該為size_t
,其正范圍大於int
類型。
這是修改后的版本:
char *strcat1(char *dest, const char *src) {
size_t i = strlen(dest);
size_t j = strlen(src);
for (size_t z = 0; z <= j; z++) {
dest[z + i] = src[z];
}
return dest;
}
請注意,您可以使用指針來實現此功能,而不會被strlen
,並且只需對源字符串進行一次掃描即可:
char *strcat1(char *dest, const char *src) {
char *p = dest;
while (*p)
p++;
while ((*p++ = *src++) != '\0')
continue;
return dest;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.