簡體   English   中英

用C中的數組構造我自己的strcat函數

[英]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)我們還必須正確終止連接的字符串。
知道ij考慮了'\\ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM