は偽と評価されますはisFloat(char array[])
です。プログラムを実行するには2回入力する必要があります。Fgets()は、文字列を読み込んだ後に2回ヒットする必要があります
fget()
コマンド以外のすべてをコメントアウトすると、のすべてが返されます。には、2回入力する必要があります。これを引き起こす原因は何ですか?私はstdin
を正しくフラッシングしており、\n
はstrtok()
によって削除されています。 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;
}
問題は 'eatLine'です。 'fgets'は既に' \ n'を含めて全ての行を食べたので、食べるものは何もありません。だから 'eatLine'への呼び出しをすべて削除すればうまくいくはずです。 'scanf'は' inputfine'で 'eatLine'を使うことができます。これは、' scanf'が入力ストリームに改行を残すので、常に食べるものがあることに注意してください。とにかく – user3386109
@ user3386109いくつかのフォーマット文字列の場合 –