2012/06/20

C言語 文字列

Cの文字列の扱いが独特なので、少し試してみる。

文字列

#include <stdio.h>
#include <stdlib.h>
int main(void){

  /* \0が入ると文字列終了と認識 通常は自動で最後に入る */
  char str0[] = "str0[] string\0string";
  printf("%s\n",str0);

  /* 強制的に配列を全部表示させてみる 最後に\0(^@)がある 
    文字列は1byteなので、1byteずつシフトしている*/
  int i;
  for(i=0; i<sizeof(str0); i++){
      printf("%c",str0[i]);
  }  

  /* 配列のインデックス指定で表示させる */
  char str1[] = "str1[] 文字列のテストです";
  printf("\n%s\n",&str1[0]);
  /* 途中から\0まで表示ということも可能 */
  printf("%s\n",&str1[3]);

  /* ポインタ 文字列最初のアドレスが入っている
  配列との差は微妙で宣言以外は同じ扱い 内部は同じ? */
  char *str2 = "*str2";
  printf("%s\n",str2);
  /* 便利なアドレスでもアクセスできる */
  printf("%s\n",&str2[2]);

  /* 文字列の応用 一部抜き出してdoubleに変換 */
  char *str3 = "param0= 0.345034;comment...", *endptr;
  double param0 = 0;
  /* 文字列比較 先頭から6文字目までが同じなら 0 を返す */
  if(strncmp(str3,"param0",6)==0){
      /* 文字列からdoubleへ変換 7文字目から読込み開始
      先頭スペースは無視 途中スペース、数字以外で終了
      それ以降はendptrへ */
      param0 = strtod(&str3[7],&endptr);
  }
  printf("param0 = %f\n",param0);
  printf("endptr = %s\n",endptr);

  return 0;
}
文字列はメモリに順序よく並んでいるデータで、配列でもポインタでも同じように扱える。Cはアクセスが柔軟で、文字列を超えたところにもアクセスできるので、ややトリッキーな使い方もできそうだ。
str0[] string
str0[] string^@string^@
str1[] 文字列のテストです
1[] 文字列のテストです
*str2
tr2
param0 = 0.345034
endptr = ;comment...


C言語 ANSI C89 Meadow & MinGW GCC 目次