C/C++テーマ--strlen関数

1764 ワード

strlen問題
テーマ:以下のコード出力結果はいくらですか? 
char *s="hello";
printf("%d
",strlen(s));// , '\0' printf("%d
",sizeof(s));//s , 32 , 4 printf("%d
",sizeof("hello"));//"hello ", '\0', 6

【参考答案】
5 4 6
テーマ:以下の出力結果はいくらですか. 
  char c[10];
  printf("%d",strlen(c));

【参考答案】
cは初期化されていないためstrlenはその長さを知ることができず,出力の値は未知である.
テーマ:次のコード出力結果はいくらですか? 
int main()
{
         char *p="abcde\0f";
         char a[]="abcde\0f";
         printf("%2d",strlen(p));
         printf("%2d",sizeof(p));
         printf("%2d",strlen(a));
         printf("%2d",sizeof(a));
         return 0;
}

【参考答案】
上記コード出力結果:5458
【解析】
strlenは文字列に関連するライブラリ関数であり、文字列の長さを計算する役割を果たし、'0'に遭遇したときに計算を停止し、文字列の長さに'0'文字は含まれません.だから
strlen(p)とstrlen(a)の長さはいずれも5である.ここでsizeofは関数ではなく演算子です.sizeof(p)は、ポインタ変数pがメモリに占めるサイズを計算する.32ビット
システムでは、任意のタイプのポインタは通常4バイトのサイズを占めているので、char*pでもint*pでも他のより複雑なタイプのポインタpでもメモリ内のサイズは
全部4.sizeof(a)は、配列aがメモリに占めるサイズを計算する.配列の大きい時間をsizeofで計算すると、配列定義時に指定されたサイズまたは文字列定数の長さになります.
度に1を加える.だからここのsizeof(a)は8.
strlenとsizeofのより多くの違いは以下の通りです.
(1)strlenの結果は実行時に算出され,文字列の長さを計算するためのものであり,メモリの大きさを計算するものではない.
(2)sizeofオペレータの結果タイプはsize_t(intタイプ);
(3)sizeofはタイプでパラメータを作ることができ、strlenはchar*でパラメータを作ることができ、「0」で終わる必要があります.sizeofは関数をパラメータとして使用することもできます(sizeofなど).
(func());
(4)sizeof後にタイプが括弧を付けなければならない場合、変数名であれば括弧を付けなくてもよい.
(5)配列はsizeofのパラメータとして劣化せず(配列も表す)、strlenに伝達された後にポインタに劣化する.
(6)1つの構造タイプまたは変数に使用される場合、sizeofは実際のサイズを返し、sizeofオペレータは動的に割り当てられた配列または外部の配列のサイズを返すことができない.