アサーションを主張する
目次
1.文字列 str1 と str2 に null ポインタがある場合はどうなりますか?
アサーション アサーションの魔法の効果:
ヘッド ファイル:
#include <assert.h>
手順:
何かが起きたくないときは、イベントの判定文をassert()の括弧の中に入れるだけで、判定がtrueで何も起こらない場合はコードが正常に実行され、falseと判定された場合はコードが実行されます。 、その後、プログラムを直接終了し、エラーを報告します。アサート アサーションの利点は、エラーを報告するときにどの行に問題があるかを正確に特定できることです。そのため、プログラマはアサート アサーションを見るときに非常に親切です。
const 変更ポインターの魔法の効果
主な用途
const が左辺と右辺にあることから、2 つのカテゴリに分類できます。
-
* の左側の const
制限はポインタの指す内容であり、ポインタ変数を介してポインタの指す内容は変更できませんが、ポインタ変数自体は変更可能です
たとえば、ポインタ p が指す内容は変更できませんが、ポインタ p 自体のアドレスは変更できます。
-
* の右側の const
制限はポインタ変数そのものであり、ポインタ変数自体は変更できませんが、ポインタが指す内容は変更できます。
たとえば、ポインタ p が指す内容を 20 に変更することはできますが、ポインタ p 自体は元の指すアドレス a を変更することはできません。
アサーションと const 変更ポインタの適用
アサーションと const 修飾ポインターについてこれまで述べてきたので、練習しましょう。
C言語のstrcpy関数の実装をシミュレートします。
この関数には 2 つのパラメーターがあり、次の文字列の内容を先頭にコピーして、ターゲット スペースの開始アドレスを返すことがわかります。
初期コード:
//模拟实现strcpy函数
char* my_strcpy(char* str1, char* str2)
{
char* ret = str1;
while (*str1++ = *str2++)
;
return ret;
}
int main()
{
char arr1[20] = "*****************";
char arr2[] = "i love jing";
//strcpy(arr1, arr2);
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
printf("%s\n", my_strcpy(arr1,arr2));
return 0;
}
上記のコードは strcpy 関数を暫定的に実装していますが、注意すべき詳細がまだたくさんあります。
-
文字列 str1 と str2 に null ポインターがある場合はどうなるでしょうか?
上記の状況の場合、アサーションを使用して 2 つの文字列が空であってはいけないと判断できます。
2. str2 が変更された場合はどうすればよいですか?
この関数を設定する際、コピーされた文字列の内容は変更できないと考えられていることがわかります。そのため、ポインタを変更するには const が必要であり、それが * の左側にあるため、 が指す内容が変更されます。ポインタは変わりません。
//模拟实现strcpy函数
#include<assert.h>
char* my_strcpy(char* str1,const char* str2)//const修饰被拷贝的字符串
{
assert(str1 != NULL);//断言判断
assert(str2 != NULL);//断言判断
char* ret = str1;
while (*str1++ = *str2++)
;
return ret;
}
int main()
{
char arr1[20] = "*****************";
char arr2[] = "i love jing";
//strcpy(arr1, arr2);
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
printf("%s\n", my_strcpy(arr1,arr2));
return 0;
}
上記のコードが最終的な解決策です。