2016-03-29 14 views
-6

投稿する前に、私の問題を解決するためにCで言及されたすべてのものを試しましたが、それはうまくいきませんでした(つまり、fgets & scanf、Cプログラム - 終了プログラムへの余分なエントリを取る

この小さなサンプルは、私が大規模なプロジェクトのために取り組んでいるコードセクションです(私は通常、小さなセグメントを書いています。トラブルシューティングがより簡単です)、私は、プログラムを実行(および終了)するために、一度のユーザー入力に対する応答を「入力」する必要があるという奇妙な問題があります。は、ファイルに書き込まれた値です(たとえば、「2」と入力するとプロンプトが再び表示されるので、「4」と入力しますが、出力ファイルに「2」という正しいエントリが入力されます)。私がプログラムを実行させるためにもう1つの値を入力しなければならないことを除いて、プログラム全体がうまく動作します(したがって、終了します)。スペースはそれを取得せず、入力するだけでそれを取得しません(2番目の番号のエントリが得られるまでプロンプトを表示し続けます)。プログラムを終了するには、値を入力する必要があります。なぜ誰かが(コードが続く)理由を見ていますか? (FWIWは、コードが正しく実行され、正しい値が与えられ、プロンプトで必要な「余分な値」を止めることができれば、私のプログラムの目的を果たします)。

興味深いことに、プログラムから最後の 'return(0)'を取り除くと、(2つのプロンプトのうち)xに入力されたLAST値が使用され、その結果が出力ファイルに保存されます。最初のプロンプト値。それを残すと、最初のものが保存されます。

私はこれまでにこの問題を抱えていませんでした。プログラムを実行(および終了)するためのプロンプトに対して2つの応答が返ってくる理由を頭に入れたりすることはできません。

私は明らかにこれについて盲目的なものを見ていますか? (これはCで、Linuxでコンパイルされ、驚くべき「二重プロンプト問題」以外で動作することがテストされています)

ありがとう。

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

int main() 

{ 

    FILE *encfile; 
    int x; 
    char val001[]="AAAA"; 
    char val002[]="AAAB"; 
    char val003[]="AAAC"; 
    char val004[]="AAAD"; 

    encfile = fopen("encoded.enx","w"); 
         //opens output file "encfile" in write mode 

    printf ("Enter a value from 1 - 4: \n"); 
         //prompts for user choice 
    scanf ("%i\n",&x); 
         //takes value of 1-4 prompt from user 

    if (x == 1) 
         //if input is '1', 

    { 
     fprintf(encfile,"%s\n", val001); 
         //prints val001 to file 'encfile' 
     return (0); 

    } 

    if (x == 2) 
         //if input is '2', 

    { 
     fprintf(encfile,"%s\n", val002); 
         //prints val002 to file 'encfile' 
     return (0); 

    } 

    if (x == 3) 
         //if input is '3', 

    { 
     fprintf(encfile,"%s\n", val003); 
         //prints val003 to file 'encfile' 
     return (0); 

    } 

    if (x == 4) 
         //if input is '4', 

    { 
     fprintf(encfile,"%s\n", val004); 
         //prints val004 to file 'encfile' 
     return (0); 

    } 

    else 
    if ((x << 1) || (x >> 4)) 
         //if input selection is out of range, 

    { 
     printf("You have chosen an invalid number\n"); 
        //prints 'out of range' message 
     return (0); 
    } 

    fclose (encfile); 
        //write file closed 

    return (0);            

} 
+1

まず、<<はビットシフト演算子です。 'x << 1'ではなく' x <1'を使うべきです。 – sikerbela

答えて

3

このように、 '\ n' はscanf関数から削除してください:

: '\ n' はscanf関数での使用に関する追加情報については、この議論を見てみましょう

scanf ("%i",&x); 

Using “\n” in scanf() in C

+0

完了!私は疲れて、そのscanfに '\ n'を書いて、それを認識していませんでした。私が思ったように、私が見落とした超シンプルな問題(そして、コードを作成している私の隣人は今、町外にいる、または私は最初に電話をしただろう)。 – Skeetersaurus

+0

あなたが必要としているのであれば、答えを受け入れるべきです。 – lukaivicev

関連する問題