0

入力をフィルタリングしたい。何が最善の方法かわかりません。アルファベットで始まる言葉を読んでもらいたい。たとえば、入力が次の場合:

This is 1 EXAMPLE1 input.

文字列は次のようになります。

This is  EXAMPLE1 input

このような入力をフィルタリングする最も簡単な方法は何ですか?

を使ってみ"%[a-zA-Z]s"ましたが、うまくいきません。

4

1 に答える 1

2

あなたのスキャン文字列"%[a-zA-Z]s"は、おそらくあなたがそうであるとは思っていません。その末尾の を削除しsます。

"%[a-zA-Z]"小文字と大文字だけで構成される文字列をスキャンします。そのため、数が割引されます。ただし、小文字または大文字で始まる英数字の文字列をスキャンする必要があります。scanfその方法で文字列を検索する機能は提供されません。代わりに、 を使用して英数字文字列をスキャンし"%[a-zA-Z0-9]"、文字列の最初の文字が数値の場合は、スキャンした入力を削除できます。

使用scanfはさまざまな理由でトリッキーです。文字列が予想より長くなり、バッファ オーバーフローが発生する可能性があります。入力が予期した形式でない場合scanf、予期しない入力を超えて先に進むことができない可能性があります。通常は、入力を無条件にバッファーに読み込み、バッファーを解析する方が信頼性が高くなります。例えば:

const char *wants
    = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::string word;
while (std::cin >> word) {
    if (!isalpha(word[0])) continue;
    std::string::size_type p = word.find_first_not_of(wants);
    word = word.substr(0, p);
    //... do something with word
}
于 2012-06-30T22:30:31.937 に答える