最新閲覧日:

ab
cd 0123
e 456
f
gh 7

のような英数字が混じったファイルを読み込み、数字が混じっている行のみを別のファイルに書き出すということをやりたいと思っています。
つまり

cd 0123
e 456
gh 7

のような形式で書き出したいわけです。
fgetsで1行ずつ読み込み、その行に数字が混じっていればfputsで書き出すというのは分かるのですが、「数字が混じっている」「混じっていない」の判定方法がわかりません。
strtodを使えば、英字のときは0が返ってくるのでそれをうまく使えば、と思って試行錯誤してみたのですが…
どなたかアドバイスをよろしくお願いします!

A 回答 (5件)

>fputs() だと、最後の '\n' は出力されません



最近はそうなのか・・・・知らなかった.
    • good
    • 0

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;
}

# 今度は、動作確認済み :-)
    • good
    • 0

やはり普通は isdigit() を使うと思います。



a-kumaさんのコードでよいかと思いますが、

if (! has_digit) {
printf("%s\n", buf);
}

の部分は

if (has_digit) {

ですよね。

また、文字列を fgets() で読み込んでいる場合は '\n' が最後に残っていますので、
printf("%s\n",buf);
とすると '\n' が2回出てきてしまいます。
fputs() だと、最後の '\n' は出力されません。
    • good
    • 0

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 を使います.
    • good
    • 0

> 「数字が混じっている」「混じっていない」の判定方法がわかりません。



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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ