0

次のようなパケットをエミュレートするために使用している構造体があります。

typedef struct{
int source;
int dest;
int type;
int port;
char data[50];
}test;

test packet[50];

そして、データフィールドにあるものをすべて画面に出力しようとしています。私の現在のコードは次のようになります。

 printf("Enter a series of data numbers from 1-50: ");
    scanf("%c", &packet[i].data[i]);

    while (packet[i].data[i]  > 48 || packet[i].data[i] > 57)
        {
        printf("Data series needs to be between 1-50, try again: ");
        scanf("%c", &packet[i].data[i]);
        }
   printf("%c \n", packet[i].data[i]);

それをいじってコンパイルすることができました.402018が返されることもあれば、Xが返されることもあり、コードを完全にスキップすることもあります.

誰かが私が間違っているところを見ることができますか? packet[i] の現在のインスタンスで char 配列全体を出力したい (パケットが作成されるたびにインクリメントされます)

while ステートメントは、入力された文字が数値であることを確認するためのものであり、ASCII によれば、数値はその範囲内にあります。

私に優しくしてください、私はこれに非常に慣れていません。

どうもありがとう。

4

2 に答える 2

0

その特定のパケットの配列の入力には、別のループ変数を使用する必要があります。現在、パケット インデックスと文字配列インデックスに同じ変数 "i" を使用しています。"scanf" の代わりに、単一の文字入力に "getche()" 関数を使用することをお勧めします。

また、 while 条件を次のように変更します。

 while (packet[i].data[x]  >= 48 || packet[i].data[x] <= 57)

ここで、「x」は追加のループ変数です。

for(i=0;i<=49;i++)
    printf("Enter a series of data numbers from 1-50: ");
    for(x=0;x<=49;x++){
        packet[i].data[x] = getche();
         printf("%c \n", packet[i].data[x]);
        if(packet[i].data[x]  >= 48 || packet[i].data[x] <= 57)
            {
            printf("Data series needs to be between 1-50, try again: ");
            packet[i].data[x] = getche();

            }
else
{
  break;
}

    }
于 2012-05-04T15:32:20.760 に答える
0

これは論理的に正しくありません。

while (packet[i].data[i]  > 48 || packet[i].data[i] > 57)
                          ^^                        ^^

最初>を に変更し<ます。

また、i 番目の配列メンバーのデータの i 番目のインデックスに書き込みを行っていますが、これも論理的に正しくないように見えます。パケットを反復処理するために 2 つのループを維持する必要があり、パケットごとに内側のループがデータをデータ配列に読み取ります。

于 2012-05-04T15:32:49.623 に答える