2

ファイル dog.txt があるとします

The quick brown fox jumps over the lazy dog.

このようなファイルから読み取ることができます

# include <stdio.h>
int main(){
  char str[10];
  FILE *fp;
  fp = fopen("dog.txt", "r");
  fscanf(fp, "%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]", str);
  printf("%s\n", str);
  return 0;
}

プログラムは を出力しますT。ただし、すべての文字をリストする代わりに、POSIX 文字クラスを利用でき[:upper:]ますか?

4

3 に答える 3

2

いいえ、できません。これはあなたができることです[]

変換指定には、一致する <右角かっこ> (' ') までのフォーマット文字列の後続のすべてのバイトが含まれます]。<left-square-bracket> の後のバイトが <circumflex> (' ') でない限り、角括弧内のバイト ( scanlist^ ) が scanset を構成します。と <right-square-bracket> の間のスキャンリスト。[]変換指定が " " または " " で始まる場合[^]、<right-square-bracket> はスキャンリストに含まれ、次の <right-square-bracket> は変換指定を終了する一致する <right-square-bracket> です。 ; それ以外の場合、最初の < right-square-bracket> は、変換指定を終了するものです。もし '-' が scanlist にあり、最初の文字でも、最初の文字が ' ^' である 2 番目の文字でも、最後の文字でもない場合、動作は実装定義です。

(のPOSIX 標準scanf。C 標準にも同様の表現があります。Adam Rosenfield の回答を参照してください。)

したがって、実装によっては、できるかもしれませんがfscanf(fp, "%[A-Z]", str)、それがどの POSIX システムでも動作するという保証はありません。いずれにせよ、[:upper:]と同じ[:epru]です。

于 2012-10-28T23:29:01.607 に答える
2

いいえ、ポータブルな方法はありません。一部の実装では、 のような文字範囲を使用できますが%[A-Z]、C 標準では保証されていません。C99 §7.19.6.2/12 は、[変換指定子について次のように述べています (強調を追加)。

変換指定子にはformat、対応する右かっこ ( ]) までの、文字列内の後続のすべての文字が含まれます。左括弧の後の文字がサーカムフレックス ( ) でない限り、括弧内の文字 ( scanlist^ ) が scanset を構成します。[]変換指定子がorで始まる場合、[^]右角かっこ文字はスキャンリストにあり、次の右角かっこ文字は仕様を終了する一致する右角かっこです。それ以外の場合、次の最初の右括弧文字が指定を終了するものです。もし-文字が scanlist にあり、最初の文字でも、最初の文字が a である 2 番目の文字^でも、最後の文字でもない場合、動作は実装定義です。

POSIX.1-2008の記述はほとんど同じ文言を持っているため (偶発的な競合の場合は ISO C 標準に従うことさえあります)、POSIX システムを使用する場合、この場合の追加の保証はありません。

于 2012-10-28T23:29:44.150 に答える
0

これを試して:

fscanf(fp, "%[A-Z]", str);
于 2012-10-28T23:30:00.247 に答える