strncpyとstrcatを組み合わせて使用する際の注意点について

1147 ワード

コードをコードするとき、1つの需要があって、Cで実現する必要があります:1つの文字列の中で特定の位置と長さのあるサブ列を切り取ります.
C++の場合は、substr関数(使用方法:string.substr(begin_position,length))を用いることができるが、C言語には類似の関数がないので、Cのstrncpy(使用方法:strncpy(char*dest,char*src,int n))で実現することが考えられる.コードの一部を選択します.
int len = strlen(s);      //    
//.......
char *left = (char*)malloc(len / 2 + 1);
strncpy(left, s, len / 2);    //        
left[len / 2] = '\0';     //           '\0',       
char *right = (char*)malloc(len - len / 2 + 1);
strncpy(right, s + len / 2, len - len / 2 + 1);   //        ;                   "\0",        

実は上記のコードは修正されていて、最初の5行目はstrcat(使用方法:strcat(char*dest,char*src):
strcat(left,"\0");

その結果、サブストリングleftは有効なデータの後、いくつかの文字化けしが発生します.資料を探して問題点を発見する.
strcat関数は文字列を接合する際、「srcで指す文字列をdestの末尾に追加して文字列の接続を実現し、接続プロセスはdestの末尾の'/0'を上書きし、接続が完了すると自動的に新しい列の末尾に'0'を追加します」、つまりstrcatはターゲット文字列の末尾の'0'を探します.しかし、サブストリングleftは親ストリングsの部分であり、末尾に'0'がないため、プログラムがstrcatを実行すると問題が発生する.
したがって、strncpyを使用する場合は、標準的な使い方:(手書きで0)
strncpy(path, src, len);
path[len] = '\0';