C言語学習記録4 fgetsを使った標準入力

ファイルを削除するプログラム

fgetsは末尾の改行も保存するのでstrchrで検索し削除を行う
(標準入力やテキストファイルから入力した場合に末尾に改行が入る)

#include<stdio.h>    
#include<stdlib.h>    // exit()
#include<ctype.h>     // toupper()
#include<string.h>    // strchr(), strlen()


int main(void)
{
  char buf[80];

  printf("削除するファイルの名前を入力してください: ");
  // fgetsはstream の先頭が EOF だった場合もしくは途中でエラーが起こった場合は NULL
  // sizeof(buf) は80
  // ただしfgetsは第二引数で渡された数値 -1までを読み込むので79文字
  if (fgets(buf, sizeof(buf), stdin) == NULL) {
    fprintf(stderr, "入力エラー\n");
    exit(1);
  }

  //末尾の改行を削除する
  if (strchr(buf, '\n') != NULL) {
    buf[strlen(buf) - 1] = '\0';
  } else {
    // 改行文字がない場合は、bufのサイズを超えた場合のためエラー終了する
    fprintf(stderr, "一行に入力可能な最大文字数(%d文字)をオーバーしました\n", sizeof(buf) -1 );
    exit(1);
  }

  printf("削除してもよろしいですか (Y/N) ");
  if (toupper(getchar()) == 'Y') {
    if (remove(buf)) {
      // removeに失敗した場合はエラー終了
      perror(buf);
      exit(1);
    }
  } else {
    printf("入力エラー\n");
    exit(1);
  }

  return 0;
}

実行例(正常に削除した場合)

$ ./file_rm 
削除するファイルの名前を入力してください: file.txt
削除してもよろしいですか (Y/N) y

実行例(存在しないファイルを削除しようとした場合)

$ ./file_rm 
削除するファイルの名前を入力してください: aiueo
削除してもよろしいですか (Y/N) y
aiueo: No such file or directory