程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C庫函數學習筆記之strcat

C庫函數學習筆記之strcat

編輯:關於C語言

先看代碼如下代碼:

#include<stdio.h>
/*for 與while循環實現*/
char* strcat1(char* to ,char* from)
{
    char* save = to;
    for(;*save;save++);
    while((*save++ = *from++)!= '\0');
  //  return save; //修改前
    return to;
}
/*for循環實現*/
char* strcat(char* to ,char* from)
{
    char* save = to;
    for(;*save;save++);
    for(;(*save = *from) != '\0';save++,from++);
  //  return save;//修改前
    return to;
}
/*while循環實現*/
char* strcat2(char* to ,char* from)
{
    char *save = to;
    while(*save) save++;
    while((*save++ = *from++ ) != '\0');
  //  return save;//修改前
    return to;
}
int main()
{
    char c[20] = {0};
//  char c[20];
    char *p = "Hello,world!" ;
    strcat2(c,p);
    printf("%s\n",c);
    return 0;
}

測試代碼中有char c[20]= {0} ;與 2、char c[20] ;

若寫成char c[20]= {0}則可以完整輸出Hello,world!,但若是char c[20]則輸出中有亂碼,

這是為什麼?


2、while循環實現中while(*save) save++;能否改成while(*save++)?;




跟進:


問題一:char c[20];定義了一個長度為20的char型數組c,但是並沒有對其進行清零操作,也就是說c[0]的值並不一定為 '\0',這個可以通過打印其值可以得到驗證。由此可知為啥定義數組和結構體等數據結構變量時需要對其先進行清零操作後再使用,否則有可能會出現莫名的異常問題。對於數組清零方式有:1、如char c[20]={0};2、使用系統清零函數:memset(c,'\0',20);問題二:while循環實現中while(*save) save++;能否改成while(*save++)?;這個很明顯不可以,後者不管*save的值是否為'\0',指針都會偏移,指向下一個地址。

問題三:對比標准的strcat函數,

char * strcat(char *s, const char *append)
{
    char *save = s;
    for (; *s; ++s);
    while ((*s++ = *append++) != '\0');
    return(save);
}

發現自己之前仿寫的函數中的問題有?

1、函數返回值問題?

之前仿寫時根本沒考慮這麼多,導致出現這麼萌的錯誤。對於函數,我們關注它什麼:函數功能,參數,返回值,不就是這三點嗎,說時簡單,自己寫代碼時就沒管這麼多了。羞愧啊!

這個函數功能是實現字符串的拼接,為什麼還需要返回指向首地址的指針呢?想了想沒結果,只好找google,原來是為了實現鏈式操作,例如:strcpy(s,strcat(s1,s2));


2、書寫*問題,即char * strcat與char* strcat所反應出來的問題?

花姐說得關於定義指針變量的三種書寫格式:

1) char * a;

2) char *a;

3) char* a;

第一種是他自己用的方式,第二種在很多開源項目中常用到,第三種是他最鄙視的用法,而我恰恰用了第三種。果斷被鄙視了一把。

char * a;三步法解釋這個語句:

1、首先在內存中申請四個字節用以存放變量a;

2、定義一個指針變量a,

3、指針指向的數據類型為char型,這決定了指針每次偏移的位數。




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved