Cスタイル文字列(C-style character string)

2281 ワード

Cスタイル文字列とは、空白文字nullで終わる文字配列である.
Cスタイル文字列は、通常(const)char*タイプのポインタで操作されます.
Cスタイル文字列の標準ライブラリ関数:#includeでいいです.C++ではincludeも使用できます.
 
Cスタイル文字列の関数:
string.hに含まれる文字列操作に関するライブラリ関数には、通常cosnt char*pのタイプのパラメータがあり、このパラメータの意味は、1つの文字ポインタを渡す必要があり、関数の実装では、その文字ポインタによってその指す文字の値を変更しないことである.実際にconstを付けると保護作用があり、関数体でビューが*pでpが指す文字値を変更するとコンパイルエラーが発生します.しかし、strcpyなどの関数はライブラリ関数であり、とっくに定義されている正しい関数であることを知っています.もちろん自分の関数体で*pを修正することはありません.constを加えると何の意味がありますか.
実際、関数パラメータの前にconstを付けるのはプログラマーに注意するだけで、私のこの関数(関数体内)は*pを修正しません.このような実パラメータpを伝えたほうがいいです.pが指す文字はconstタイプです.もちろん、このような実パラメータを伝えなければなりません.pが指す文字は普通の非constタイプで、違法ではありません.
 
しかし、ほとんどの文字列処理に関連する関数では、cosnt char*タイプに渡されるポインタがNULLで終わる文字列(文字配列)を指す必要があります.
これらの関数の実行プロセスは、nul文字が終了するまで、実パラメータが指す文字から後方に検索されるためです.NULL以外の最後のポインタ(NULL以外の最後の文字配列名、または文字ポインタ変数(1つの要素のみを指す文字配列に相当)が渡されると、関数は配列の最後の要素に実行され、NULLに遭遇しないため、メモリ内のnullの最後の要素に遭遇するまで境界を越えて実行されます.境界を越えると、メモリ内のストレージ内容は予想できず、プログラムの実行結果も予想できません.
 
cosnt char*タイプのパラメータに加え、char*タイプのパラメータもあります.
例:char*strcpy(char*strDestination,const char*strSource);MSDNにおけるパラメータstrDestinationの解釈はDestination string(ターゲット文字列)であり、Null-terminatedは要求されないため、文字配列char strを定義することができる[80].
#include <string.h>
#include <stdio.h>

void main( void )
{
   char string[80];
   strcpy( string, "Hello world from " );
   strcat( string, "strcpy " );
   strcat( string, "and " );
   strcat( string, "strcat!" );
   printf( "String = %s
", string ); }

文字配列は初期化されておらず、各要素の値は予想できません.しかしstrcpyが文字列「Hello world from」の値を配列にコピーすると、配列の前のいくつかの要素の値はHello world from0であり、後の要素は予想できない.
strcatでは
char *strcat( char *strDestination, const char *strSource);
パラメータstrDestinationのタイプはchar*であるが、MSDNではNull-terminated destination stringと解釈される.
 
要約:(1)パラメータタイプがcosnt char*であり、NULL-terminatedが要求される場合(通常はそう要求される)、nullが終了する文字配列を指す文字ポインタが渡されます.(一般的には1文字配列名または文字列定数を用いる).
(2)パラメータタイプがchar*である場合、NULL-terminatedが要求されているかどうかを確認する.あるいは、このパラメータがどのように伝達されるかを実際の状況から考える.NULL_がなければterminatedの要件は、文字列を受信するために使用され、十分な文字配列を定義し、配列名を伝達すればよい.そうでなければ、(1)に記載の伝達ポインタのように.