文字列操作の例

文字列結合の例

fopenするファイルの拡張子を補う例を示す。 以下のプログラムは、データファイルとして開くファイル名をユーザに聞き、

  1. そのままのファイル名
  2. うしろに.txtをつけたファイル名
  3. うしろに.datをつけたファイル名

の3つを順に試して、みつかったファイルを開くような仕組みのものである。

fname.c

#include <stdio.h>
#include <string.h>
#define MAXNAME	1024

void debug(char *file)
{
  fprintf(stderr, "Trying %s...\n", file);
}

int main()
{
  char basename[MAXNAME], openfile[MAXNAME];
  char txt[] = ".txt", dat[] = ".dat";
  char buf[100];
  int n;
  FILE *datafile;
  fprintf(stderr, "データファイルの名前は?: ");
  fgets(buf, sizeof buf, stdin);
  sscanf(buf, "%s", basename);
  debug(basename); /* 開こうとするファイル名をデバッグ表示 */
  if (NULL == (datafile = fopen(basename, "r"))) {
    /* 入力した名前のファイルが開けなかったら */
    /* いったんその名前を openfile にコピーして、 */
    strlcpy(openfile, basename, sizeof openfile);
    /* ".txt" を追加してみる */
    strlcat(openfile, txt, sizeof openfile);
    debug(openfile);
    if (NULL == (datafile = fopen(openfile, "r"))) {
      /* それでもだめなら */
      strlcpy(openfile, basename, sizeof openfile);
      /* ".dat" を追加してみる */
      strlcat(openfile, dat, sizeof openfile);
      debug(openfile);
      if (NULL == (datafile = fopen(openfile, "r"))) {
        fprintf(stderr, "データファイルを作っといてね\n");
        exit(1);
      }
    }
  }
  for (n=0; fgets(buf, sizeof buf, datafile); n++)
    printf("%3d: %s", n, buf);
  fclose(datafile);
}

文字列照合の例

入力した文字列の末尾の改行を切り取る処理は、strrchrと 文字列ポインタを利用してもできる。

strchrstrrchrで文字が見付かったときには、 その文字の位置(アドレス)が返るので、それをchar型のポインタ変数に入れておく。 たとえば、元の文字列 x が、

"http://hogehoge.jp"

だとして、この文字列の中に : (コロン)文字があるかどうか調べるときは、

if (strchr(x, ':')) {
  ...
}

とするが、見付かった位置を捨ててしまわず、char型のポインタ変数にしまっ ておく。

char *p;
〜〜中略〜〜
p = strchr(x, ':');
if (NULL != p) {
  ...
}

あるいはまとめて、

if (NULL != (p=strchr(x, ':'))) {
  ...
}

のように書き、ifで条件がマッチしたブロック内で利用する。

これをふまえて末尾の改行を切り取る処理は、以下のようにも書くことがで きる。

char buf[10];
char *p;
fprintf(stderr, "お名前は? ");
fgets(buf, sizeof buf, stdin);
if (NULL != (p=strrchr(buf, '\n')))
  *p = '\0';	/* 改行文字の位置に \0 を上書き */

目次