- 締切済み
英数字の判定
ab cd 0123 e 456 f gh 7 のような英数字が混じったファイルを読み込み、数字が混じっている行のみを別のファイルに書き出すということをやりたいと思っています。 つまり cd 0123 e 456 gh 7 のような形式で書き出したいわけです。 fgetsで1行ずつ読み込み、その行に数字が混じっていればfputsで書き出すというのは分かるのですが、「数字が混じっている」「混じっていない」の判定方法がわかりません。 strtodを使えば、英字のときは0が返ってくるのでそれをうまく使えば、と思って試行錯誤してみたのですが… どなたかアドバイスをよろしくお願いします!
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- dtm
- ベストアンサー率37% (23/62)
>fputs() だと、最後の '\n' は出力されません 最近はそうなのか・・・・知らなかった.
- a-kuma
- ベストアンサー率50% (1122/2211)
albertpark> の部分は albertpark> if (has_digit) { albertpark> ですよね。 その通り (^^; お詫びがてら、ポータブルな方法をもうひとつ。strpbrk() という関数があります。 ある文字列に対して、指定した文字のうちのどれかが含まれているかどうかを判定 する関数です。 使ったソースはこんな感じ。 #include <string.h> #include <stdio.h> int main() { FILE* f = fopen("m.txt", "r"); char buf[1024]; while (fgets(buf, sizeof(buf), f)) { if (strpbrk(buf, "0123456789")) { fputs(buf, stdout); } } return 0; } # 今度は、動作確認済み :-)
- albertpark
- ベストアンサー率10% (1/10)
やはり普通は isdigit() を使うと思います。 a-kumaさんのコードでよいかと思いますが、 if (! has_digit) { printf("%s\n", buf); } の部分は if (has_digit) { ですよね。 また、文字列を fgets() で読み込んでいる場合は '\n' が最後に残っていますので、 printf("%s\n",buf); とすると '\n' が2回出てきてしまいます。 fputs() だと、最後の '\n' は出力されません。
- dtm
- ベストアンサー率37% (23/62)
char buf[256]; char* p; FILE* is; /* 入力 */ FILE* os; /* 出力 */ while (p = fgets(buf, 255, is)) { while (*p && !isdigit(*p)) p++; if (*p) fputs(buf, os); } アプローチは全く同じで,isdigit を使います.
- a-kuma
- ベストアンサー率50% (1122/2211)
> 「数字が混じっている」「混じっていない」の判定方法がわかりません。 isdigit() という関数(普通は、マクロ)がありますので、それを使うのが良いでしょう。 int has_digit; char buf[1024]; /* これに一行の文字列が入る */ /* buf に文字列を入れて */ has_digit = 0; for (ch = buf ; *ch && ! has_digit ; ++ch) { has_digit = isdigit(*ch); } if (! has_digit) { printf("%s\n", buf); } これを行数分だけループさせれば良いんではないかな? # 試してません m(_ _)m