C:使用;scanf";读取一行其他字符内的浮点数
我是C语言的新手,正在编写一个充当计算器的程序,其中每行输入代码都以一个运算符开头,然后包含一个可能的空格、一个数字、更多可能的空格和一个换行符。我被指示使用C:使用;scanf";读取一行其他字符内的浮点数,c,scanf,getchar,C,Scanf,Getchar,我是C语言的新手,正在编写一个充当计算器的程序,其中每行输入代码都以一个运算符开头,然后包含一个可能的空格、一个数字、更多可能的空格和一个换行符。我被指示使用getchar读取除浮点以外的所有内容,并使用scanf读取浮点 我不确定如何使用scanf读取混合在其他字符行中的浮点。下面的代码显示了while循环的大部分内容,其中还包括读取其余字符,但最相关的部分是最后3行 while (1) { int ic = getchar(); if (ic < 0)
getchar
读取除浮点以外的所有内容,并使用scanf
读取浮点
我不确定如何使用scanf
读取混合在其他字符行中的浮点。下面的代码显示了while循环的大部分内容,其中还包括读取其余字符,但最相关的部分是最后3行
while (1) {
int ic = getchar();
if (ic < 0)
break; //EOF
char temp = (char) ic;
if (temp == '+' || temp == '-' || temp == '*' || temp == '/' ||
temp == '=' || temp == 'C' || temp == 'Q'){
op = (char) ic;
}
if (temp >= '0' && temp <= '9'){
char valu = scanf("%c", &temp);
val = (double) valu;
...
while(1){
int ic=getchar();
if(ic<0)
break;//EOF
字符温度=(字符)ic;
如果(temp='+'| | temp='-'| | temp='*'.'| | temp=='/'| |
temp=='='| | temp=='C'| | temp=='Q'){
op=(char)ic;
}
如果(温度>='0'&&temp一步一步
我建议不要忽略良好的错误检查。假设用户输入可能是意外的
其中每行输入代码都以运算符开头
很像OP的代码
int ic = getchar();
if (ic == '+' || ic == '-' || ic == '*' || ic == '/' || ic == '=' || ic == 'C' ||ic == 'Q'){
op = (char) ic;
} else (ic == EOF) {
break; //EOF
} else {
fprintf(stderr, "Unexpected input %d\n", ic);
break;
}
然后包含潜在的空白
使用isspace()
测试空白
while (isspace( (ic = getchar()) )) {
;
}
unget(ic, stdin); // ic is not a white-space - put it baack
float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
fprintf(stderr, "Unexpected FP input\n");
break;
}
一个数字
一定要检查scanf()
返回值。关于%f”
的一个关键属性是它使用前导空格,包括'\n'
。要检测数字之前的'\n'
,前面的isspace()
循环很有用。现在代码知道它要读取的第一个字符不是任何空格
while (isspace( (ic = getchar()) )) {
;
}
unget(ic, stdin); // ic is not a white-space - put it baack
float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
fprintf(stderr, "Unexpected FP input\n");
break;
}
更多可能的空格和换行符
请记住,“\n”
也是一个空白
while ((ic = getchar()) != '\n' && isspace(ic)) {
;
}
if (ic != '\n') {
fprintf(stderr, "Unexpected trailing text %d\n", ic);
break;
}
// Success
当代码未达到成功时,在尝试解析新行文本之前,代码应消耗所有输入,直到'\n'
或EOF
。逐步
我建议不要忽略良好的错误检查。假设用户输入可能是意外的
其中每行输入代码都以运算符开头
很像OP的代码
int ic = getchar();
if (ic == '+' || ic == '-' || ic == '*' || ic == '/' || ic == '=' || ic == 'C' ||ic == 'Q'){
op = (char) ic;
} else (ic == EOF) {
break; //EOF
} else {
fprintf(stderr, "Unexpected input %d\n", ic);
break;
}
然后包含潜在的空白
使用isspace()
测试空白
while (isspace( (ic = getchar()) )) {
;
}
unget(ic, stdin); // ic is not a white-space - put it baack
float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
fprintf(stderr, "Unexpected FP input\n");
break;
}
一个数字
一定要检查scanf()
返回值。关于%f”
的一个关键属性是它使用前导空格,包括'\n'
。要检测数字之前的'\n'
,前面的isspace()
循环很有用。现在代码知道它要读取的第一个字符不是任何空格
while (isspace( (ic = getchar()) )) {
;
}
unget(ic, stdin); // ic is not a white-space - put it baack
float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
fprintf(stderr, "Unexpected FP input\n");
break;
}
更多可能的空格和换行符
请记住,“\n”
也是一个空白
while ((ic = getchar()) != '\n' && isspace(ic)) {
;
}
if (ic != '\n') {
fprintf(stderr, "Unexpected trailing text %d\n", ic);
break;
}
// Success
当代码未达到成功时,在尝试解析新行文本之前,代码应使用所有输入,直到'\n'
或EOF