2
#include<stdio.h>
#include<conio.h>
main()
{
      int i;
      char c, text[30];
      float f;
      printf("\nEnter Integer : ");
      scanf("%d",&i);
      printf("\nEnter Character : ");
      c = getch();
      printf("\nEnter String:");
      gets(text);
      printf("\nEnter Float:");
      scanf("%f",&f);
      printf("\nInteger : %d",i);
      printf("\nCharacter : %c8",c);
      printf("\nString : %s",text);
      printf("\nFloat : %f",f);
      getch();
}

この単純なプログラムが関数stringを使用してa を読み取ることができないのはなぜですか? gets()それを修正するには、他に何を使用すればよいですか?私の古い 32 ビット PC の Turbo C では動作しましたが、ここでは動作しませんでした...

4

3 に答える 3

3

ちょっとした調査で、問題はscanf(). scanf()行末文字 '\n' のない行を読み取ります。これはバッファ内にとどまり、次のステートメントで実際に赤くなるようです。

fgets(または、)sscanf()を次のように使用することもできます。

私が使用した文字を読むには:

fgets(text,sizeof(text),stdin);
sscanf(text,"%c",&c); /* or: c = text[0]; */

使用した整数を読み取る

fgets(text,sizeof(text),stdin);
sscanf(text,"%d",&i);

私が持っていたCコース(DevC ++)でgets()に大きな問題があり、コンパイラとしてアドバイスされました。しかし、私はアドバイスに従わなかったことを完全に思い出し、 fgets() の動作もコンパイラに依存していることが判明しました。

のマニュアルページにgets()は次のものがあります。

バグ

gets() を使用しないでください。データを事前に知らずに gets() が読み取る文字数を知ることは不可能であり、gets() はバッファーの末尾を超えて文字を格納し続けるため、使用するのは非常に危険です。コンピューターのセキュリティを破るために使用されています。代わりに fgets() を使用してください。

于 2012-08-10T18:42:10.130 に答える
3

Scanf またはその他の入力解析関数は、stdin からの呼び出しで指定された必要な数の文字のみを取得し、その他を拒否します。その結果、これらの拒否された値は、stdin の次の読み取り中に、改行文字とともに変数に入り、したがって入力をスキップします。したがって、stdin をクリーンアップし、ガベージが他の変数に入るのを防ぐクリア ルーチンを呼び出す方がよいでしょう。

あなたのコードは非常に脆弱ですが、それでも解決策があります:-

#include<stdio.h>

  int clear()
  {
    while ((getchar())^'\n');    
  }
  int  main()
    {
          int i;
          char c, text[30]={0};
          float f;
          printf("\nEnter Integer : ");
          scanf(" %d",&i);
          printf("\nEnter Character : ");     
          scanf(" %c",&c);    
          printf("\nEnter String:");
      clear();
          gets(text);
          printf("\nEnter Float:");   
          scanf(" %f",&f);    
          printf("\nInteger : %d",i);
          printf("\nCharacter : %c",c);
          printf("\nString : %s",text);
          printf("\nFloat : %f",f);
          getchar();
    }
于 2012-08-10T19:57:35.610 に答える
2

最初の整数として42 (またはその他) を入力すると、実際には42、そして ENTER を押して改行文字の 3 文字を入力します。最初の scanf は整数を読み取ります。つまり、42のみを読み取り、入力バッファーに改行文字を残します。

プログラムが gets に到達すると、その改行文字だけで構成される非常に短い行を読み取ります。

次のように、scanf の直後に改行文字を読み取って破棄することで修正できます。

printf("\nEnter Integer : ");
scanf("%d",&i);
while (getchar() != '\n')
    ;
于 2012-08-10T18:41:53.013 に答える