strcatとstrncatはどちらも文字列に文字を追加する関数であることは誰もが知っていますが、両者の違いは何ですか?彼らの原則は何ですか?
まず、2つの原則を理解して、それらを区別できるようにする必要があります
。strcatの使用法-strcat関数の呼び出し、2つの文字列配列または文字列配列と文字列の受け渡し、string.hヘッダーを呼び出す必要がありますファイル;
char arr1[30] = "abcd";
char arr2[] = "efd";
strcat(arr1, arr2);
----------------------
strcat (str,"concatenated.")
ソースコードは
次のとおりです(自分で実装しました。実際のソースコードとは異なりますが、原則は同じです)ステップ1:追加した文字列のポインタを文字列 '\ 0'にポイントします
ステップ2:Exchangeを変更します追加された文字列の「\ 0」を含む追加された文字列
ステップ3:strの最後の位置を「\ 0」に設定します
void strcat(char* str, const char* d)
{
while (*str)
str++;
while (*d != '\0')
{
*str = *d;
str++;
d++;
}
str++;
*str = '\0';
}
int main()
{
char arr1[30] = "abcd";
char arr2[] = "efd";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strncatの使用法-strncat関数を呼び出し、2つの文字列と整数値を渡します。整数値は追加する文字数を表します。string.hヘッダーファイルを呼び出す必要があります。
char str1[20] = "abcde";
char str2[20] = "cdefad";
strncat (str1, str2, 6);
ソースコード:
ステップ1:arr1のポインターを「\ 0」に移動します。
ステップ2:arr2が指す要素をarr1が指す要素と交換します。
void my_strncat(char* arr1, char* arr2, int len)
{
assert(arr1);
assert(arr2);
arr1 = arr1 + len;
while (len-- != 0)
{
//第一步:先把arr1的指针移到'\0'处
//第二步:把arr2所指向的元素与arr1所指向的元素交换;
*arr1 = *arr2;
arr1++;
arr2++;
}
}
int main()
{
char arr1[30] = "abcdeef";
int len = strlen(arr1);
my_strncat(arr1, arr1, len);
printf("%s\n", arr1);
return 0;
}
2つのパラメータに一貫性がないことがはっきりとわかりますが、効果は同じです。2つの主な違いは、strcat()の追加された文字列の終了条件がstr2 == '\ 0'(str2追加された文字列); strncatのループが終了するための条件は、追加される文字列の数lenが0であることです。
では、なぜ同じ効果を達成する2つの機能が必要なのでしょうか。
2つの実装効果は同じように見えますが、元の文字列を元の文字列に追加する場合は、strncat関数のみを使用できます。
char arr1[30] = "abcd";
strcat(arr1, arr1);
strcatは基本的に、追加する文字列の「\ 0」を追加した文字列の要素と交換するため、追加自体の場合、「\ 0」は前の要素と交換され、すべての交換が後で完了すると、 '\ 0'が再び後方に移動したため、終了条件が確立されなくなり、無限ループに陥ります。strcat()の便利な点は、2つを渡すだけで達成できることです。比較的単純なパラメータ。
ただし、上記の無限ループに陥る可能性はないため、strncat()の使用をお勧めします。最大でもう1つのステップ長(strlen(配列名))がカウントされ、strncat()には自由である不可欠な利点追加する文字を制御します。