c,c++における文字列処理関数strtok,strstrstr,strchr,strsub

3940 ワード

1,文字列カット関数
関数プロトタイプ:char*strtok(char*s,char*delim);
関数機能:文字列sを文字列delimに従って分割し、分割の結果を返します.
関数は次のように使用されます.
1.strtok関数の実質的な処理は、strtokがdelimに含まれる文字をsで検索し、文字列全体を検索するまでNULL(’/0’)で置き換えることである.この文には,(1)strtok関数を呼び出すたびに1つの分割単位しか得られないという2つの意味がある.(2)すべての分割ユニットを取得するにはstrtok関数を繰り返し呼び出す必要がある.
2.strtok関数以降の呼び出しはNULLで置き換える.
3.パラメトリックs(分割する文字列)に対応する変数にはchar s[]=「...」を適用する.形式ではなくchar*s="..."形式.
例は次のとおりです.
#include  
#include
int main(void)
{
      char buf[]=”Golden Global View”;
      char* token = strtok( buf, "");
      while( token != NULL )
      {
           printf( ”%s “, token );
           token = strtok( NULL, ” “);
      }
      return 0;
}
結果は次のとおりです.
Golden
Global
View
 
しかし、char buf[]="Golden Global View";char*buf="Golden Global View";割り当てられたサイズが同じであることを前提にchar*pとchar b[]にも違いがあり、char*p=「abc」であるため、エラーが発生します.char b[]="abc"; この2つの文がコンパイルされると、コンパイラは「abc」を定数領域に配置します.strtok(char*s,char*delim)関数は、sでdelimに含まれる文字を検索し、文字列全体を検索するまでNULL(’/0’)で置き換えます.この言葉はポインタと配列の違いを体現することができます:検索する以上p++/b++が必要です.('/0')に置き換えるには、*p/*bに*p='/0';b='/0'; pポインタは定数文字列を指し、*p操作は文字列操作であり、これは明らかにコンパイルできない.bは文字配列のヘッダアドレスであり、この配列の中の要素は「a」、「b」、「c」、「/0」であり、文字列「abc」と同じように見えるが、同じではない.すなわち、b配列には他のもの'1'、'2'、'3'、'/0'を格納することができ、char b[]=「abc」にコンパイルされているにすぎない.このb配列の要素値を後で変更するので、*bの操作に文字列には影響しません.
token=strtok(NULL,"");token=strtok(buf,"")に置き換えると、whileサイクルは無限ループになり、出力された結果はGoldenのみになります.私の説明の原因は、strtok関数体にcharタイプのポインタ(char*pと仮定)があるからです.、その役割はp=sを、sの開始アドレスを保存するために使用することである.その後の処理ではポインタpの値は常に保存される(C言語ではポインタの特徴)ため、sの代わりに後でstrtok呼び出しでNULLを用いるのは、pが再付与されてsの開始アドレスを指すことを防止し、最後に完全な文字列を分割するまでpがsの他の位置を指すことを保証することができるからである.しかし、NULLの代わりにsを使用すると、strtokが呼び出されるたびにpはsの初期アドレスを指し、上記の例のようにwhileは無限ループであり、出力される結果は「Golden」にすぎない.
2、文字列内の文字列の検索
strstr()関数は、文字列に最初に出現したサブストリングの位置を取得するために使用され、その原型はchar*strstr(char*str、char*substr);【パラメータの説明】strは取得する文字列であり、substrは取得するサブ列である.【戻り値】文字列strにサブストリングsubstrが初めて現れるアドレスを返す.サブストリングが取得されない場合はNULLを返します.【関数例】strstr()関数の使用.
  • #include
  • #include
  • int main(){
  • //char str[]="に変更することもできますhttp://see.xidian.edu.cn/cpp/u/xitong/";
  • char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
  • char *substr = "see";
  • char *s = strstr(str, substr);
  • printf("%s", s);
  • return 0;
  • }

  • 実行結果:
    see.xidian.edu.cn/cpp/u/xitong/ 
    3、文字列に最初に出現する文字の位置を検索
    strchr()は、文字列に最初に現れる文字の位置を検索するために使用され、その原型はchar*strchr(const char*str,int c);【パラメータ】strは検索する文字列であり、cは検索する文字である.strchr()は、str文字列に最初に現れた文字cのアドレスを見つけ、そのアドレスを返します.注意:文字列strの終了フラグNULも検索範囲に含まれるので、strのグループの後の文字も位置決めできます.【戻り値】指定した文字が見つかった場合は、その文字が存在するアドレスを返し、そうでない場合はNULLを返します.返されるアドレスは、文字列がメモリにランダムに割り当てられたアドレスに、検索した文字が文字列の位置に追加されます.文字列に文字が最初に現れる位置をiとすると、返されるアドレスはstr+iと理解できる.ヒント:文字列の最後に文字が表示される場所を検索する場合はstrrchr()関数を使用します.【例】文字5が最初に出現する位置を検索する.
  • #include
  • #include
  • #include
  • int main(){
  •     char *s = "0123456789012345678901234567890";
  •     char *p;
  •     p = strchr(s, '5');
  • printf("%ld", s);
  •     printf("%ld", p);
  • system("pause");
  •     return 0;
  • }

  • 出力結果:
    12016464
    12016469 
    4,文字列指定位置間の文字列を取得する
    str.substr(startpos, length);
    ここでstartposは開始文字のシーケンス番号であり、lengthは[startposから]取得した文字列の長さ(
    startpos ).
    str中のシーケンス番号mからnまでの間(nを含まない)のサブ文字列を取得するには
    str.substr(m, n-m);
     
    #include #include using namespace std;
    main(){string s("12345 asdf");string a=s.substr(0,4);//取得文字列s中0位から4の長さの文字列cout<}
    出力結果:1234