0

初めて機能し、2回目に実行すると、2番目のscanf関数がスキップされます。いくつかのページからグーグルで検索した後、バッファリングに \n を追加するのは scanf 関数の動作であることに気付き、これを解決するために、scanf の後に fflush(stdin) を追加し、機能しましたが、2 回目に実行すると、間違った結果を教えてください。誰かがこのプログラムの問題を教えてくれますか?

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

int main()
{
char UserInput[50];
int i = 0;
int exit;


do{


printf("Please enter a string (less than 50 character): ");
scanf("%[a-z,A-Z, ,]s",&UserInput);

while(UserInput[i] != '\0' && i<50)
{
    i++;
}

if (i==50)
    printf("The string is too long\n");
else
    printf("The length of the string is %d\n",i);

printf("To continue, please key in any numbers other than 0: ");
scanf("%d",&exit);
    fflush(stdin);
}while(exit !=0);

system("PAUSE");
return 0;
}
4

3 に答える 3

1

アンパサンドを使用して配列を読み取ることはありません。行を次のように変更します。

scanf("%[a-z,A-Z, ,]s",UserInput);

また、 exit も整数ではなく char 配列です。exit を int に変更するか、scanf を次のように変更しますscanf("%s",exit);。そして、私を信じて exitは、変数の名前として適切ではありませんC

于 2013-02-14T09:06:27.713 に答える
0

いくつかの間違いと意見:

  1. スキャンセット形式(%[a-zA-Z ])を使用する場合s、最後にを使用することは想定されていません。また、カンマが存在することも想定されていません。
  2. 呼び出すときに戻りコードをチェックして、scanf読み取られるはずの内容を実際に正常に読み取ったことを確認する必要があります。
  3. バッファがオーバーフローするリスクがありUserInputます。長さ49の文字列のみが許可されますが、バッファを埋めるときにそのような制限はありません。
  4. 各反復の後に、ポップにリセットiして戻ることはありません。0
  5. exitintフォーマットを使用して入力するため、タイプは、である必要があります%d。他の場所で指摘されているようにexit、Cでは特に適切な変数名ではありません(と呼ばれる標準関数がありますexit)。
  6. scanf前回の読み取りの残りを適切に読み取らずに、複数の呼び出しを使用します。入力を1行ずつ(fgetsたとえばを使用して)バッファに読み込んでから、そのバッファから必要なデータを解析することをお勧めします。
  7. fflush(のような)入力ストリームでは使用しないでくださいstdin。これは、出力ストリームのみを対象としています。
于 2013-02-14T09:21:21.150 に答える
0

いくつかの問題があります。

長さを計算するためのループは少し無意味です。また、i一度実行した後にリセットされないため、2 回目の試行で壊れます。

ループを削除しstrlen()、長さを計算する必要がある場合は代わりに使用してください。

さらに良いのは、の使用を削除して代わりにsscanf()使用することです。fgets()

&UserInput少し無意味であることに注意してください。名前UserInputは、関数呼び出しの最初の要素 ( ) へのポインターに「減衰」し、&UserInput[0]それを述べる最良の方法です。

fgets(UserInput, sizeof UserInput, stdin);

は、私がそれを書く方法です。戻り値を確認することを忘れないでください。

于 2013-02-14T09:19:08.350 に答える