2016-04-08 9 views
1

は偽と評価されますisFloat(char array[])です。プログラムを実行するには2回入力する必要があります。Fgets()は、文字列を読み込んだ後に2回ヒットする必要があります

fget()コマンド以外のすべてをコメントアウトすると、のすべてが返されます。には、2回入力する必要があります。これを引き起こす原因は何ですか?私はstdinを正しくフラッシングしており、\nstrtok()によって削除されています。 printf()関数が問題を引き起こしていますか?私はscanf()fgets()を一緒に使用すると問題を引き起こす可能性があると読んだことがあります。しかしここで彼らarent。

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

int isFloat(char array[]) 
{ 

int m = 0; 
int periodCount = 0; 

for(m=0; array[m] != '\000'; m++) 
    { 
     if(array[m] == '1' || array[m] == '2' || array[m] == '3' || array[m] == '4' || array[m] == '5' || array[m] == '6' || array[m] == '7' || array[m] == '8' || array[m] == '9' || array[m] == '0') 
      { 
      } 
     else 
      { 
       if(array[m] == '.' && periodCount == 0 && m != 0 && m+1 != '\n') 
        periodCount = 1; 
       else 
        return 0; 
      } 
    } 
return 1; 
} 

void eatLine() 
{ 
    while (getchar() != '\n'); 
} 

int main() 
{ 

double firstNum = 0.0; 
double secondNum = 0.0; 
double totalNum = 0.0; 
int success = 0; 
int TEN_THOUSAND = 10000; 
char input[TEN_THOUSAND]; 

//Outputs assignment header 
printf("CS201 - Lab 2 - Number Adder\n\n"); 

printf("first number: "); 
fgets(input, TEN_THOUSAND, stdin); 
strtok(input, "\n"); 
success = isFloat(input); 
if(success) 
    firstNum = atof(input); 

while(!success) 
{ 
    eatLine(); 
    //The one is for testing purposes 
    printf("-- bad input --\n"); 
    printf("first number: "); 
    fgets(input, TEN_THOUSAND, stdin); 
    strtok(input, "\n"); 
    success = isFloat(input); 
    if(success) 
     firstNum = atof(input); 
} 

printf("second number: "); 
fgets(input, TEN_THOUSAND, stdin); 
strtok(input, "\n"); 
success = isFloat(input); 
if(success) 
    secondNum = atof(input); 

while(!success) 
{ 
    eatLine(); 
    //The one is for testing purposes 
    printf("-- bad input --\n"); 
    printf("second number: "); 
    fgets(input, TEN_THOUSAND, stdin); 
    strtok(input, "\n"); 
    success = isFloat(input); 
    if(success) 
     secondNum = atof(input); 
} 

//adds the numbers 
totalNum = firstNum + secondNum; 

//Solves ugly formatting problem by firstly including a newline 
//after the input is garnered. then it outputs firstNum and totalNum 
//in a field of 11 spaces with a newline terminator. This decrements 
//11 to 10 on the secondNum line to compensate for the space that the + takes up. 
printf("\n%11.2f\n", firstNum); 
printf("%s%10.2f\n", "+", secondNum); 
printf("-----------\n"); 
printf("%11.2f\n\n", totalNum); 

return 0; 
} 
+1

問題は 'eatLine'です。 'fgets'は既に' \ n'を含めて全ての行を食べたので、食べるものは何もありません。だから 'eatLine'への呼び出しをすべて削除すればうまくいくはずです。 'scanf'は' inputfine'で 'eatLine'を使うことができます。これは、' scanf'が入力ストリームに改行を残すので、常に食べるものがあることに注意してください。とにかく – user3386109

+0

@ user3386109いくつかのフォーマット文字列の場合 –

答えて

3

私は機能isFloat(char array[])でfalseに評価される何かを入力すると、私は維持するために2回入力ヒットする必要があります。完全なコード

問題エリア

printf("first number: "); 
    fgets(input, TEN_THOUSAND, stdin); 
    strtok(input, "\n"); 
    success = isFloat(input); 
    if(success) 
     firstNum = atof(input); 

プログラム実行中。

これは、テキスト行を入力することを期待するコード行があるためです。

while(!success) 
{ 
    eatLine(); // Culprit 
+0

Brilliant!それは働いた、ありがとう。 getchar()は '\ n'で停止するので、 '\ n'がストリームを正しく入力するのを待っていますか? –

+0

@TobiasGreenでは、改行文字を含むすべての文字を読み込み、破棄する 'while(getline()!= '\ n')'を使用しています。 –