• ベストアンサー

ファイル読み込み2

#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; char s[256]; if ((fp = fopen("memo.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); } while (fgets(s, 256, fp) != NULL) { printf("%s", s)         } fclose(fp);         return 0; } というファイルから一行入力をするプログラムなのですが これにファイルから数字だけを取り出して出力するという機能を追加したいと思います。 例えば 中央の競馬学校(騎手課程)に入る際の倍率は15~20倍です。 合格者の上限も15人という規定があります。 平成21年度の合格者は出願者114人に対し7人です。 騎手免許試験ですが新人の場合は合格率100%と考えていいと思います。 合格できる実力がなければ競馬学校(地方競馬教養センター)の課程を修了できないからです。 というファイルだと 15 20 15 21 114 7 100 というような感じです。   関数isdigitを使うやり方ならなんとなくわかるのですが 今後のことも考えてポインタを使うやり方を身につけたいと思いますのでご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

以下は文字列内の数値の先頭位置に移動して表示を行うポインタを使ったサンプルです。 敢えて詳細解説はしませんので、これを解析してみてください。 C標準の関数しか使ってないのでわからない関数はヘルプ参照で。 -- char *p = s; while(*p != '\0') { p += strcspn(p, "0123456789"); if(*p != '\0') { while(isdigit(*p)) { putchar(*p++); } putchar('\n'); } }

その他の回答 (3)

  • arain
  • ベストアンサー率27% (292/1049)
回答No.4

No.2より >あ、その7は半角でお願いします。。 でしたら、No.1氏の方法が基本となります。 >関数isdigitを使うやり方ならなんとなくわかるのですが >今後のことも考えてポインタを使うやり方を身につけたいと思いますので ということを「isdigit()を使用しない」と解釈すると…… while(isdigit(*p)) は while(('0' <= *p) && (*p <= '9')) になります。 #3 > shift_jis は問題ないんだっけ.... isdigit()の範囲とはかぶらないのでとりあえずは大丈夫です。 厳密には0x80~0x9F、0xE0~0xFFなら2Byte文字と判断して読み飛ばしは入れておいた方がいいけど。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#2 の「実際には~」のところの話ですが, 使ってる文字コードは? EUC ならいいけど, JIS だと泣きながら処理することになります. shift_jis は問題ないんだっけ....

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

一つ確認。 以下の部分。 >平成21年度の合格者は出願者114人に対し7人です。 「21」と「114」は問題ないけど、「7」は全角文字なんだけどこれも数字として扱う必要がありますか? 実際には、数字以外の文字も「半角(1Byte文字)」と「全角(2Byte文字)」の区別が必要なんだけど。

minaraiH
質問者

補足

あ、その7は半角でお願いします。。

関連するQ&A