-1

最初の入力を行うと、動作する前に余分な 0 が表示されgets()ます。しかし、削除すればgets()問題ありません。printf()空白で切れるので使えません。代替ソリューションを教えてください。または、どうすればよいですか?

 #include <cstdio>
 #include <iostream>
 #include <stdlib.h>
 using namespace std;
 int main()
 {
  long long a,i,t,count;
  int op;
  char s[10000];
  scanf("%lld",&t);
  for(i=1;i<=t;i++)
  {
    gets(s);
    a=atoll(&s[7]);
    printf("%lld",a);
  }
  return 0;
 }
4

4 に答える 4

3

scanf()は、入力ストリームの最初の行の行末文字を残し、gets()によって消費されます。これは、ここでよく説明される一般的な初心者のエラーです。

推奨事項:

  1. scanf()ルーチンとgets()ルーチンを混在させないでください。
  2. 短いテストプログラムを除いて、 gets()使用しないでください(代わりにfgets()を使用してください)。gets()を使用するとバッファオーバーフローが発生する可能性があるためです。
于 2012-04-13T06:20:46.760 に答える
2

なぜだめですか:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    long long i;
    long long t;
    char s[10000];

    if (fgets(s, sizeof(s), stdin) == 0)
        return 0;
    t = atoll(s);
    for (i = 1; i <= t; i++)
    {
        if (fgets(s, sizeof(s), stdin) == 0)
            break;
        a = atoll(&s[7]);
        printf("%lld\n", a);
    }
    return 0;
}

他の利点の中でも、それはしません:

  • 浮遊ゼロを印刷し、
  • C++ コードを C プログラムと称するものにインクルードし、
  • 不要な (未使用の) 変数を含む
  • 危険なgets()機能を使用してください。

いくつかの欠陥に注意することは公正です。

  • データ行が少なくとも 8 文字の長さでない場合、偽の出力が生成されます。strlen(s)呼び出す前に確認する必要がありますatoll(&s[7])
  • 10K は、読み取るために与えられるどの 1 行よりも長いと想定するので、行が切り捨てられても問題にはなりませんが、JSON データは改行なしでファイルにエンコードされることがあり、非常に長くなる可能性があります (Firefox のブックマーク リスト)。またはバックアップ、たとえば、単一の改行さえ含まれていません)。
于 2012-04-13T07:02:42.747 に答える
2

scanf で読み取るときに、「\n」文字を追加してみてください。

 scanf("%lld\n",&t);
  for(i=1;i<=t;i++)
  {
    gets(s);
    a=atoll(&s[7]);
    printf("%lld",a);
  }
于 2012-04-13T06:55:27.127 に答える
1

あなたがここで何をしようとしているのか、あるいは問題は何なのか、私は確信しています。だが ...

  1. Greg Hewgillが正しく言ったように、「gets()」は絶対に使用しないでください。発生するのを待っているバッファオーバーフローです。

  2. 「fgets()」を使用できます-そしてそれは問題を簡単に解決することができます。

  3. あなたがそれにいる間、なぜ「scanf()」、「gets()」、そして「atoll()」が続くのですか?これらの入力のいずれかをマージできますか?または、より一貫性を持たせましたか?

  4. 「atoll()」からの有効な変換をどこでチェックしていますか?「sscanf()」を使用して(そして戻り値をチェックして)みませんか?

于 2012-04-13T06:20:59.280 に答える