詳細なstrncpyとシミュレーションの実装

記事のディレクトリ

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がヌル文字を指すまで割り当てます。

おすすめ

転載: blog.csdn.net/DR5200/article/details/112525326