1

csv があり、各値が整数であると想像してください。したがって、最初の値は INTEGER100です。

fscanf() にこの行を読み取らせて、それが整数のみであるかどうかを教えてもらいたいです。したがって、それは合格します100が、 で失敗し100tます。私が仕事を得ようとしてきたのは「%d」です。カンマは CSV の区切り文字です。したがって、関数全体は

fscanf(fp, "%d,", &count)

残念ながら、これは「100t」では失敗し、「100」では機能し、「t」では機能します。したがって、とを区別していないだけです100100tもちろん、これらの数字の後にはすべてコンマが続きます)

4

6 に答える 6

7

strtol代わりに使用してください。

于 2010-04-11T03:37:55.097 に答える
5

fscanf は実際には、他のいくつかの回答が示唆するよりもはるかに使いやすいですが、ほとんどの人はそれをよく知らず、その機能を最大限に活用する方法を知りません。

便利なポイント: まず、fscanf からの戻り値を使用します。これは、変換されたアイテムの数を示します。次に、「スキャン セット」変換は非常に便利です。次のことを考慮してください (以前sscanfは外部ファイルを必要としないようfscanfにしていましたが、読み取り元のソースのみが異なります)。

#include <stdio.h>

int main() { 
    int i;
    char *test[] = {
        "100,",    // should succeed.
        "100t,",   // should fail.
        "t"        // should also fail.
    };

    for (i=0; i<3; i++) {
        int count;
        char ch[2];
        if (2 == sscanf(test[i], "%d%[,]", &count, &ch))
            fprintf(stderr, "Conversion of \"%s\" succeeded.\n", test[i]);
        else
            fprintf(stderr, "Conversion of \"%s\" failed.\n", test[i]);
    }
    return 0;
}
于 2010-04-11T04:00:48.653 に答える
5

あなたはそうしない。

問題は、それfscanf()があまり役に立たないことです。これを処理する最善の方法は、行全体 (または行のかなりの部分) を読み取ってから、文字列を分析することです。次に例を示します。

int value;
char *extra;
char buffer[100];

// read in some data from the buffer
fgets(buffer, sizeof buffer, stdin);

// parse out a digit, if we can
i = strtol(buffer, &extra, 0);

この時点でextra、行が純粋な数字ではないことを意味する余分な文字があるかどうか、またはextraが の先頭を指している場合はbuffer、解析する数字がないことを確認できます。

于 2010-04-11T03:44:26.950 に答える
1

どうですか

fscanf(fp, "%d%c", &count, &aChar)

if aChar != ',' && != '\n' の場合、整数しかありません

于 2010-04-11T03:46:33.440 に答える
0

関数ファミリーは、このscanf()種のエラーを検出するのが得意ではありません。それは不可能ではありません (Jerry Coffin の回答を参照してください。これは機能しますが、IMO を一般化するのは困難です) が、IMO はそれほど堅牢ではありません。より良いオプションは、 を使用fgets()して入力をテキストとして読み取り、strtok()または類似のものでトークン化し、または を使用strtol()strtod()てトークンを数値に変換することです。

char buffer[LINE_SIZE];
while (fgets(buffer, sizeof buffer, inFile))
{
  char *token;
  char *newline = strchr(buffer, '\n');
  if (newline) 
    *newline = 0;
  token = strtok(buffer, ",");
  while (token)
  {
    char *chk;
    int value = (int) strtol(token, &chk, 10);
    if (!isspace(*chk) && *chk != 0)
    {
      printf("%s is not a valid integer\n", token);
    }
    else
    {
      printf("successfully read integer value %d\n", val);
    }
    token = strtok(NULL, ",");
  }
}

if (feof(inFile))
{
  printf("Hit end-of-file\n");
}
else
{
  printf("Error during read\n");
}
于 2010-04-11T13:33:15.970 に答える
0

100% 制御されていない入力の scanf 関数は、エラーをなくすのに苦労する可能性があります。 fgets() を使用して行を読み取り、次に strtok() を使用して行をトークンに分割し、変換できるようにすることをお勧めします。

「100t」のように 1 つのトークンで atoi を使用すると 0 になりますが、「100」は 100 になります。

于 2010-04-11T03:41:21.693 に答える