为什么我的程序直接跳过变量初始化后的第一条指令

  • 本文关键字:变量 初始化 指令 一条 程序 c
  • 更新时间 :
  • 英文 :


所以我正试图编写一个程序,从左到右计算表达式(就像操作是按输入顺序执行的一样(。例如:

Enter an expression: 1+2.5*3
Value of expression: 10.5

所以,我应该在不使用数组或字符串的情况下完成此操作。我的想法是继续扫描字符,直到扫描的字符与0到9之间的任何数字都不同。然后,字符被转换为浮点值,根据最后扫描的字符,执行求和、乘法和whatnot运算。

这是我写的:

#include <stdio.h>
#include <math.h>
int main() {
char digit = ' ';
int counter = 0;
int number = 0
float reversed_number = 0, reversed_decimal = 0, reversed_number2 = 0,
reversed_decimal2 = 0, result = 0;
printf("Enter an expression: ");
while(digit != 'n') {
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_number = pow(10, i)*(number / 10);
number /= 10;
}
if(digit == '.'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_decimal = pow(10, i)*(number / 10);
number /= 10;
counter++;
}
reversed_decimal /= pow(10, counter - 1);
reversed_number += reversed_decimal;
counter = 0;
}
else if(digit == '+'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_number2 = pow(10, i)*(number / 10);
number /= 10;
}
if(digit == '.'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_decimal2 = pow(10, i)*(number / 10);
number /= 10;
counter++;
}
reversed_decimal2 /= pow(10, counter - 1);
reversed_number2 += reversed_decimal2;
counter = 0;
}
result += reversed_number + reversed_number2;
}
else if(digit == '-'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_number2 = pow(10, i)*(number / 10);
number /= 10;
}
if(digit == '.'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_decimal2 = pow(10, i)*(number / 10);
number /= 10;
counter++;
}
reversed_decimal2 /= pow(10, counter - 1);
reversed_number2 += reversed_decimal2;
counter = 0;
}
result += reversed_number - reversed_number2;
}
else if(digit == '*'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_number2 = pow(10, i)*(number / 10);
number /= 10;
}
if(digit == '.'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_decimal2 = pow(10, i)*(number / 10);
number /= 10;
counter++;
}
reversed_decimal2 /= pow(10, counter - 1);
reversed_number2 += reversed_decimal2;
counter = 0;
}
result += reversed_number * reversed_number2;
}
else if(digit == '/'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_number2 = pow(10, i)*(number / 10);
number /= 10;
}
if(digit == '.'){
for(int i = 0; digit >= 48 && digit <= 57; i++){
digit = getchar();
number += pow(10, i)*(digit - 48);
}
for(int i = 0; number == 0; i++){
reversed_decimal2 = pow(10, i)*(number / 10);
number /= 10;
counter++;
}
reversed_decimal2 /= pow(10, counter - 1);
reversed_number2 += reversed_decimal2;
counter = 0;
}
result += reversed_number / reversed_number2;
}
}
printf("Value of expression: %g", result);
return 0;
}

代码编译得很好,没有任何警告,但当我运行程序时,会发生一些奇怪的事情,它甚至没有打印出"输入一个表达式:",它只是不断地听取用户的输入。我真的不明白为什么。。。即使代码与我的推理完全错误,它至少应该打印出第一个printf函数,因为在它之前没有任何东西可以使程序循环。

这里到底发生了什么?因为我不知道

发生了一些奇怪的事情,它甚至没有打印出"输入一个表达式:">

这是因为I/O缓冲。printf不会立即写入,而是使用缓冲区。对于stdout,这是一个行缓冲区,这意味着它只会在看到换行时刷新缓冲区(即写入(。由于您从不打印换行符,因此stdout从不刷新。可以显式刷新stdout

printf("Enter an expression: ");
fflush(stdout);

,它只是继续监听用户输入

一些调试打印件揭示了这个问题。

while(digit != 'n') {
printf("Top of while digit: '%c'n", digit);
for(int i = 0; digit >= 48 && digit <= 57; i++){
puts("in loop");
digit = getchar();
printf("  digit: '%c'n", digit);
number += pow(10, i)*(digit - 48);
}
printf("After first loop: '%c'n", digit);
for(int i = 0; number == 0; i++){
printf("In second loop, number: %dn", number);
reversed_number = pow(10, i)*(number / 10);
number /= 10;
}
printf("Digit: '%c'n", digit);
$ ./test
Enter an expression: Top of while digit: ' '
After first loop: ' '
In second loop, number: 0
In second loop, number: 0
In second loop, number: 0
In second loop, number: 0
In second loop, number: 0
...

第一个循环看到digit,并立即退出而不调用number == 0。这留下了CCD_ 8,因此第二循环无休止地运行为0的CCD_。

相反,如果你想逐行处理,读一行,然后解析它

char line[BUFSIZ];
fgets(line, sizeof(line), stdin);
for( int i = 0; line[i] != 'n' && line[i] != ''; i++ ) {
printf("%c", line[i]);
}

然后,为了进一步清理您的代码,您可以使用scanf和朋友,而不是检查单个ASCII代码。

if( isdigit(*c) ) {
printf("%c is a digit!n", *c);
}

或者,这是使用CCD_11从输入中读取和解析整个数字的合适时机。

最新更新