fopenするファイルの拡張子を補う例を示す。 以下のプログラムは、データファイルとして開くファイル名をユーザに聞き、
.txtをつけたファイル名
 .datをつけたファイル名
の3つを順に試して、みつかったファイルを開くような仕組みのものである。
#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と
文字列ポインタを利用してもできる。
strchrやstrrchrで文字が見付かったときには、
その文字の位置(アドレス)が返るので、それを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 を上書き */