記事のディレクトリ
strncpyの紹介
ルーチン | 必要なヘッダー | 互換性 |
---|---|---|
strncpy | <string.h> | ANSI、Win 95、Win NT |
関数プロトタイプ:
char * strncpy(char * strDest、const char * strSource、size_t count);
特徴:
strncpy関数は、strSourceの最初の文字をstrDestにコピーし、strDestのアドレスを返します。countがstrSourceの長さ以下の場合、コピーされた文字列にnull文字が自動的に追加されることはありません。countがstrSourceの長さより大きい場合、ターゲット文字列は長さcount内のヌル文字で埋められます。ソース文字列とターゲット文字列が重複している場合、strncpyの動作は定義されていません。
1.カウントがstrsourceの長さ以下
#include<stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "hello bit";
strncpy(arr1, arr2, 4);
}
監視ウィンドウから、countがstrSourceの長さ以下の場合、コピーされた文字列にnull文字が自動的に追加されないことがわかります。
2.countがstrSourceの長さよりも大きい
#include<stdio.h>
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
strncpy(arr1, arr2, 6);
}
監視ウィンドウから、countがstrSouceの長さよりも大きい場合、ソース文字列をコピーした後、countまでターゲット文字列の末尾に「\ 0」を追加することがわかります。
strncpyのアナログ実装
#include<stdio.h>
char* my_strncpy(char* dest, const char* src,size_t count)
{
char* start = dest; // 记录目标字符串起始位置
while (count && (*dest++ = *src++)) // 拷贝字符串
{
count--;
}
if (count) // 当count大于src的长度时,将补充空字符
{
while (--count)
{
*dest++ = '\0';
}
}
return start;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
my_strncpy(arr1, arr2, 6);
printf("%s\n", arr1);
}
このコードを理解するのはもっと難しいかもしれません:
*dest++ = *src++
* srcの値を* destに割り当て、次にsrc ++、dest ++などを、srcがヌル文字を指すまで割り当てます。