文字列


定数

文字列の構造

      "abcd" =  {'a', 'b', 'c', 'd', '\0'}

[例] 文字列の長さを求める.

int main(void) {
  char *c = "mojiretu no rei";
  char *p;
  printf("文字列: %s\n", c);
  printf("文字列を個々に出力: ");
  p = c;                           // ポインタpを文字列cの先頭に設定
  while(*p != '\0') {              // pの指し示す値(文字)[*p]が終端記号に達するまで以下を繰り返す
    putchar(*p);
    p++;                           //  pを次の文字に進める
  }
  putchar('\n');
  printf("文字列の長さは,%dでした\n", p-c);  // 終端記号の位置(アドレス)と先頭位置の差が文字の長さ
}

次のプログラムも同じ動作をする

int main(void) {
  int n;
  char *c = "mojiretu no rei";
  printf("文字列: %s\n", c);
  printf("文字列を個々に出力: ");
  n = 0;
  while(*(c+n) != '\0') {
    putchar(*(c+n));
    n++;
  }
  putchar('\n');
  printf("文字列の長さは,%dでした\n", n);
}

ポインタ

[例]
      int n;
      char *a, *p; // 文字データへのポインタを宣言
      char b, c;
      c = 'x';
      b = c;
      p = &c;      // ポインタpに変数cのアドレスを格納する
      c = 'y';

      if(c == b)  printf("c[%c]とb[%c]は等しい\n", c, b);
      else printf("c[%c]とb[%c]は等しくない\n", c, b);

      if(c == *p) printf("c[%c]と*p[%c]は等しい\n", c, *p);
      else printf("c[%c]と*p[%c]は等しくない\n", c, *p);

      a = "xyz";   // 文字列"xyz"をメモリ内に記憶し,
                   // その先頭アドレスをポインタ変数 a に記憶させる
      for(n=0; n<4; n++) printf("%d: %c[%0.2x]\n", n, *(a+n), *(a+n));
実行過程での値の変化
ポインタを用いて配列を参照することができる. 次の例は文字配列を使用して文字列を操作している.


コマンドラインからプログラムにデータを渡す

main関数は引数を受け取ることができる.
      #include <stdio.h>
      int main(int argc, char *argv[]) {
         int n;
         for(n=0; n<argc; n++) {
            printf("%d: %s\n", n, argv[n]);
         }
      }


ファイル

unix(linux)で扱うファイルはすべて, 連続したバイトデータの列(byte stream)である


演習問題2

    以下の設問において,1行分の文字列は100文字を越えないものとする.

  1. 1行分の文字列を読み込み, 小文字を大文字に変換して書き出すプログラムを作りなさい. [ヒント]
  2. 空白を区切り記号とする1行分の文字列を読み込み, 単語に区切って改行表示をするプログラムを作りなさい.

    [入出力の例]

    
    入力データ
          This is a sentence
    出力データ
          This
          is
          a
          sentence
  3. 上のプログラムをコンマ(,)やピリオッド(.)などの区切り記号にも対応するよう, プログラムを書き換えなさい.

    [入出力の例]

    
    入力データ
          I'm fine, and you?
    出力データ
          I'm
          fine
          ,
          and
          you
          ?
  4. 空白を区切り記号とする1行分の文字列を読み込み, 単語の個数を求めるプログラムを作成しなさい.
  5. 空白を区切り記号とする1行分の文字列を読み込み, その中の,最も長い単語,および, 最も短い単語の長さを求めるプログラムを作りなさい.
  6. manコマンドはオンラインマニュアルを読むためのものである.
          man ls
    と入力すると標準出力に ls コマンドの説明が表示(出力)される.

    パイプを利用して,この出力である文字データを受け取り, その中に小文字の a がいくつ出現するかを数えるプログラムを作りなさい.

  7. 上のプログラムの機能を拡張して,テキストファイルを読み込み, a〜zまでの各文字の出現回数を報告するプログラムを作りなさい.