strcpy、strncpy、strncpy_sとsnprintf

2546 ワード

1、strcpy
プロトタイプ宣言:
extern char *strcpy(char* dest, const char *src);
ソース列の0に基づいて終了判断した場合、コピーが必要なバッファの大きさはチェックされず、ターゲットスペースが足りなければオーバーフローの問題があります.
2、strncpy
プロトタイプ
char * strncpy(char *dest, char *src, size_t n);
文字列srcの内容(文字、数字、漢字....)を文字列destにコピーすると、size_tの値でどれだけコピーするかが決まり、destへのポインタが返されます.空の文字('0')に遭遇した場合、空の文字の後ろに元の文字が表示されます
コードは次のとおりです.
dest[]="Hell99iam!";
src[]="abc\0def";
strncpy(dest,src,5);

このときdest領域は,'a','b','c','0','0','9','i','a','m','!'
ではなく、「a','b','c','0','0','0','0','0','0','0','0','0','0'
'0','0'は'!に追加されたわけではありません!で行ないます.各要素のasciiをforサイクルで出力して決定することができる.
strncpyは文字列コピーの推奨方法です
3、strncpy_s
プロトタイプ:errno_t strncpy_s( char *strDest, size_t numberOfElements, const char *strSource, size_t count );
パラメータnumberOfElementsは、destのバイト数を示し、ターゲットポインタdestのスペースが足りないことを防止し、char*ではなくエラーコードを返すように戻ります.
文字列の最後に空の文字が埋め込まれます.
countパラメータは、ターゲットバッファサイズより小さい必要があります.
次のようなコードがあります.
char dst[5];
strncpy_s(dst, sizeof(dst), "a long string", 5);

strncpy_を使用することを示します.sは5バイトをdstバッファにコピーし、空き文字終端子に余分なスペースを与えることなく、空き文字を埋めるとオーバーフローし、異常処理ハンドルを呼び出す.
文字を空にする必要がある場合に使用_TRUNCATEまたは(size–1)
コードは次のとおりです.
char dst[5];
strncpy_s(dst, sizeof(dst), "a long string", _TRUNCATE);
strncpy_s(dst, sizeof(dst), "a long string", sizeof(dst)-1);

strncpyとは異なりcountパラメータがソース文字列より長い場合strncpy_sは指定した長さまで文字を空にしません.
ソースアドレス文字列とターゲットアドレス文字列が重なる場合、結果は定義されません.
_sバージョン関数は標準ライブラリではなく、推奨されていません.
4、snprintf
プロトタイプ:
int snprintf(char *str, size_t size, const char *format, ...)
可変パラメータ(...)formatに従って文字列にフォーマットしstrにコピー
(1)フォーマットされた文字列長(2)フォーマットされた文字列の長さ>=sizeの場合、その中の(size-1)文字のみをstrにコピーし、その後に文字列の終端('0')を追加し、書き込みたい文字列の長さを返します.
#include 
int main () {
  char a[16];
  size_t i;
  i = snprintf(a, 13, "%012d", 12345);  //   1    
  printf("i = %lu, a = %s
", i, a); // :i = 12, a = 000000012345 i = snprintf(a, 9, "%012d", 12345); // 2 printf("i = %lu, a = %s
", i, a); // :i = 12, a = 00000001 return 0; }