OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

英数字の判定

  • 困ってます
  • 質問No.145317
  • 閲覧数190
  • ありがとう数1
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 0% (0/5)

ab
cd 0123
e 456
f
gh 7

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

cd 0123
e 456
gh 7

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

回答 (全5件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

> 「数字が混じっている」「混じっていない」の判定方法がわかりません。 isdigit() という関数(普通は、マクロ)がありますので、それを使うのが良いでしょう。 int has_digit; char buf[1024]; /* これに一行の文字列が入る */ /* buf に文字列を入れて */ has_digit = 0; for (ch = buf ; * ...続きを読む
> 「数字が混じっている」「混じっていない」の判定方法がわかりません。

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


  • 回答No.2
レベル9

ベストアンサー率 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); } アプロー ...続きを読む
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 を使います.
  • 回答No.3
レベル5

ベストアンサー率 10% (1/10)

やはり普通は isdigit() を使うと思います。 a-kumaさんのコードでよいかと思いますが、 if (! has_digit) { printf("%s\n", buf); } の部分は if (has_digit) { ですよね。 また、文字列を fgets() で読み込んでいる場合は '\n' が最後に残って ...続きを読む
やはり普通は isdigit() を使うと思います。

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

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

の部分は

if (has_digit) {

ですよね。

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

ベストアンサー率 50% (1122/2211)

albertpark> の部分は albertpark> if (has_digit) { albertpark> ですよね。 その通り (^^; お詫びがてら、ポータブルな方法をもうひとつ。strpbrk() という関数があります。 ある文字列に対して、指定した文字のうちのどれかが含まれているかどうかを判定 する関数です。 使ったソースはこんな感じ。 ...続きを読む
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;
}

# 今度は、動作確認済み :-)
  • 回答No.5
レベル9

ベストアンサー率 37% (23/62)

>fputs() だと、最後の '\n' は出力されません 最近はそうなのか・・・・知らなかった.
>fputs() だと、最後の '\n' は出力されません

最近はそうなのか・・・・知らなかった.
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ