#include <stdio.h>
#include <rpcndr.h>
int main() {
boolean playAgain=1;
char playInput;
float num1,num2,answer;
char operator;
while (playAgain){
printf("Enter First Number, operator, second number:");
scanf("%f%c%f",&num1,&operator,&num2);
switch (operator) {
case '*':
answer=(num1*num2);
break;
case '/':
answer=(num1/num2);
break;
case ' ':
answer=num1 num2;
break;
case '-':
answer=num1-num2;
break;
default:break;
}
printf("%f\n",answer);
printf("Do You Want To Try It Again(y/n)?");
scanf("%c",&playInput);
if(playInput=='n'){
playAgain=0;
}
}
}
do while 可以做這段代碼。但我想知道為什么這個方法會出錯。Scanf() 函式存在問題。錯誤提示:Clang-Tidy: 'scanf' used to convert a string to a floating-point value, but function will not report conversion errors; 考慮使用“strtof”代替
uj5u.com熱心網友回復:
有一些問題。
第一個scanf不會檢查數字中的語法錯誤,可能會在流中留下換行符并混淆第二個scanf
所述第二 scanf 可不會從流剝離換行,所以在第二回圈迭代,所述第一 scanf可能有問題。
雖然有可能修復/扭曲scanf做你想做的事,但我會遵循 clang 的警告并使用strtof.
這是重構為使用fgetsand的代碼strtof。注釋為:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <rpcndr.h>
// lineget -- get a line from user with prompt
// RETURNS: pointer to buffer (NULL means EOF)
char *
lineget(char *buf,size_t len,const char *prompt)
{
char *cp;
// output prompt to user
puts(prompt);
fflush(stdout);
do {
// get an input line
cp = fgets(buf,len,stdin);
// got EOF
if (cp == NULL)
break;
// strip newline
buf[strcspn(buf,"\n")] = 0;
} while (0);
return cp;
}
int
main(void)
{
float num1, num2, answer;
char *cp;
char buf[1000];
int err;
char operator;
while (1) {
cp = lineget(buf,sizeof(buf),
"Enter First Number, operator, second number:");
if (cp == NULL)
break;
// get the first number
num1 = strtof(cp,&cp);
// get the operator
// NOTE: this could be a syntax error for the first number -- we'll
// check that below in the switch
operator = *cp;
if (operator != 0)
cp;
// get second number and check for syntax error
num2 = strtof(cp,&cp);
if (*cp != 0) {
printf("ERROR trailing '%s'\n",cp);
continue;
}
err = 0;
switch (operator) {
case '*':
answer = (num1 * num2);
break;
case '/':
answer = (num1 / num2);
break;
case ' ':
answer = num1 num2;
break;
case '-':
answer = num1 - num2;
break;
default:
err = 1;
break;
}
// we got a bad operator (or syntax error in first number)
if (err) {
printf("ERROR unknown operator '%c'\n",operator);
continue;
}
printf("%f\n", answer);
cp = lineget(buf,sizeof(buf),"Do You Want To Try It Again(y/n)?");
if (cp == NULL)
break;
if (buf[0] == 'n')
break;
}
return 0;
}
更新:
上面的代碼將檢測到大多數錯誤。這是一個增強版本,可以進行更明確的檢查:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <rpcndr.h>
// lineget -- get a line from user with prompt
// RETURNS: pointer to buffer (NULL means EOF)
char *
lineget(char *buf,size_t len,const char *prompt)
{
char *cp;
// output prompt to user
puts(prompt);
fflush(stdout);
do {
// get an input line
cp = fgets(buf,len,stdin);
// got EOF
if (cp == NULL)
break;
// strip newline
buf[strcspn(buf,"\n")] = 0;
} while (0);
return cp;
}
int
main(void)
{
float num1, num2, answer;
char *cp;
char *bp;
char buf[1000];
int err;
char operator;
while (1) {
bp = lineget(buf,sizeof(buf),
"Enter First Number, operator, second number:");
if (bp == NULL)
break;
// get the first number
num1 = strtof(bp,&cp);
// ensure we got at least a digit
// NOTE: this will detect:
// ""
// "j"
if (cp == bp) {
printf("ERROR no first number specified\n");
continue;
}
// get the operator
// NOTE: this could be a syntax error for the first number -- we'll
// check that below in the switch
operator = *cp;
// no operator specified
if (operator == 0) {
printf("ERROR no operator specified\n");
continue;
}
// skip over the operator
bp = cp;
// get second number and check for syntax error
num2 = strtof(bp,&cp);
if (*cp != 0) {
printf("ERROR trailing '%s'\n",cp);
continue;
}
// we need at least one digit (e.g.):
// we want to reject: 23 and ensure we have [at least] 23 0
// this will detect 23 k
if (cp == bp) {
printf("ERROR no second number specified\n");
continue;
}
err = 0;
switch (operator) {
case '*':
answer = (num1 * num2);
break;
case '/':
answer = (num1 / num2);
break;
case ' ':
answer = num1 num2;
break;
case '-':
answer = num1 - num2;
break;
default:
err = 1;
break;
}
// we got a bad operator (or syntax error in first number)
if (err) {
printf("ERROR unknown operator '%c'\n",operator);
continue;
}
printf("%f\n", answer);
cp = lineget(buf,sizeof(buf),"Do You Want To Try It Again(y/n)?");
if (cp == NULL)
break;
if (buf[0] == 'n')
break;
}
return 0;
}
uj5u.com熱心網友回復:
編輯:fflush 是未定義的行為,您可以使用 getchar() 清除緩沖區
#include <stdio.h>
void clear_input_buffer()
{
char tmp;
do
{
tmp = getchar();
} while (tmp != '\n' && tmp != EOF);
}
int main()
{
_Bool playAgain = 1;
char playInput;
float num1, num2, answer;
char operator;
while (playAgain)
{
printf("Enter First Number, operator, second number:");
scanf("%f%c%f", &num1, &operator, & num2);
clear_input_buffer();
switch (operator)
{
case '*':
answer = (num1 * num2);
break;
case '/':
answer = (num1 / num2);
break;
case ' ':
answer = num1 num2;
break;
case '-':
answer = num1 - num2;
break;
default:
break;
}
printf("%f\n", answer);
printf("Do You Want To Try It Again(y/n)?");
scanf("%c", &playInput);
clear_input_buffer();
if (playInput == 'n')
{
playAgain = 0;
}
}
}
舊:你應該使用 fflush(stdin) (如果你的編譯器支持它,它是未定義的 c 標準)或不同的方法來清除輸入緩沖區,否則 scanf 將在最后讀取一個額外的 \n 導致它跳過其余部分緩沖區中的資料
#include <stdio.h>
int main() {
_Bool playAgain=1;
char playInput;
float num1,num2,answer;
char operator;
while (playAgain){
printf("Enter First Number, operator, second number:");
scanf("%f%c%f",&num1,&operator,&num2);
fflush(stdin);
switch (operator) {
case '*':
answer=(num1*num2);
break;
case '/':
answer=(num1/num2);
break;
case ' ':
answer=num1 num2;
break;
case '-':
answer=num1-num2;
break;
default:break;
}
printf("%f\n",answer);
printf("Do You Want To Try It Again(y/n)?");
scanf("%c",&playInput);
fflush(stdin);
if(playInput=='n'){
playAgain=0;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311171.html
