1

私の仕事は、2 つの数字列を読み取り、それらを異なる配列に保存することです。scanf 関数を使用することにしましたが、プログラムは最初の文字列しか読み取ることができません。これは私の悪いコードです。

int main()
{

    int firstArray[50], secondArray[50], i, j;

    /* fill an array with 0 */
    for(i=0; i<50; ++i)
    {
        firstArray[i]=secondArray[i]=0;
    }

    i=j=0;

    while((scanf("%d", &firstArray[i]))== 1) { ++i; }
    while((scanf("%d", &secondArray[j]))== 1) { ++j; }

    /* Print this. */
    for(i = 0; i < 20; ++i)
    {
        printf("%d ", firstArray[i]);
    }
    putchar('\n');

    for(j = 0; j < 20; ++j)
    {
        printf("%d ", secondArray[j]);
    }

    return 0;
}

scanf 関数の仕組みがわかりません。誰か説明してくれませんか?

4

4 に答える 4

0

あなたは数字の列を言い、あなたは読みます%d. この形式は、入力をスキャンして、整数 (符号付き) 値を表す最長のシーケンスを探します。最初の while ループで 2 つの「数字列」が消費されます。

編集「数字の文字列」の代わりに「整数の文字列」と言うべきです。この場合、最初の while はすべての整数を消費する可能性があるため、少し微妙です。ただし、整数ではないもの( aなど;) で区切られている場合を除きます。

したがって、以下を機能させるには、2 つの「行」を、整数として解析できず、「白い文字」と見なされないもので区切る必要があります。より良い解決策ではありませんが、可能な解決策の 1 つです。

#include <stdio.h>
#include <ctype.h>

int main()
{

  int firstArray[50] = {0};
  int secondArray[50] = {0};
  int i, j, l1, l2;
  int tmp;

  i = j = 0;

  // read integers, but not more than size of array
  while( scanf("%d", &firstArray[i]) == 1 && i < sizeof(firstArray) ) { 
    ++i; 
  }

  // consume non digits
  for(tmp = getchar(); tmp != EOF && !isdigit(tmp); tmp = getchar());
  // on EOF you should exit and stop processing;
  // we read one more char, push it back if it was a digit
  if (isdigit(tmp)) ungetc(tmp, stdin);

  while( scanf("%d", &secondArray[j]) == 1 && j < sizeof(secondArray) ) { 
    ++j; 
  }

  l1 = i; // preserve how many ints were read
  l2 = j;

/* Print this. */
  for(i = 0; i < l1; ++i)
  {
    printf("%d ", firstArray[i]);
  }
  putchar('\n');

  for(j=0; j < l2; ++j)
  {
    printf("%d ", secondArray[j]);
  }

  return 0;
}

編集ニーズにより適した解決策は、行を (一度に 1 つ) バッファーに読み込み、バッファーを sscanf することです。

于 2012-04-15T10:10:31.937 に答える
0

実際、C の配列には特別な点が 1 つあります。

配列のサイズを宣言しますが。言う5int arr[5];のサイズを超える値を格納できます。エラーは表示されませんが、未定義の動作につながります (他の変数を上書きする可能性があります)。

この質問を参照してください。そこに格納されている要素の

あなたの場合、それがあなたの問題でした。コンパイラは、最初の while ステートメントを超えることはありませんでした。したがって、出力は得られませんでした。実際、まだコード全体をコンパイルしていません!

while((scanf("%d", &firstArray[i]))== 1) { ++i; }

したがって、この while ステートメントは次のように記述できます。

while(  scanf("%d", &firstArray[i]) ==1 && i<50 )  
    i++;

またはそうでなければ:

while(i<50 )
{
        scanf("%d", &firstArray[i]);             
        i++;
}

またはそうでなければ:

for (i=0; i<50; i++)
    scanf("%d", &firstArray[i]);
于 2012-04-15T09:50:37.967 に答える