【问题标题】:C - Read in float value using getchar and print out float using printfC - 使用 getchar 读取浮点值并使用 printf 打印出浮点数
【发布时间】:2016-05-20 08:27:38
【问题描述】:

我非常迷茫和困惑。

我必须使用 getchar 读取像 3.432 这样的浮点整数。然后,我必须使用 printf 再次将其打印为精度为 4 位小数的浮点数。所以 3.432 --> 3.4320 和 .450 --> .4500 和 453 --> 453.0000。

我一直在使用 getchar() 并且我理解这一点,但是试图将值重新转换为浮点数是我非常迷茫的地方。

 float num = 0.0;
 char ch;
 while((ch = getchar()) != '\n'){
      num = ch - '0';
      printf("%.4f", num);
 }

我知道为什么这是错误的以及它会输出什么,但这就是我目前所拥有的

编辑:我只能使用 getchar 来读取浮点值

【问题讨论】:

  • ch 包含小数点时,num 将发生什么值。即num = ch - '0'; ?
  • 是的,我只能使用 getchar,不能使用 atof。我正在考虑将其转换为浮点数,但每个单独的字符都是浮点数
  • 您的代码 sn-p 是一个好的开始,但您的问题到底出在哪里?

标签: c


【解决方案1】:

未测试(没有时间)。希望对您有所帮助。

#include <stdio.h>

int main(void)
{
    float num = 0.0;
    float i = 1.0;
    char ch;

    printf("Enter a float number: ");

    while((ch = getchar()) != '\n')
    {
        if (ch == '.')
        {
            i = 0.1;
        }
        else if ((ch>= '0') && (ch <='9'))
        {
            if (i==1)
            {
                num *= 10;
                num += ch - '0';
            }
            else
            {
                num += (ch - '0') * i;
                i /= 10;
            }
        }
    }

    printf("%.4f\n", num);

    return 0;
}

【讨论】:

    【解决方案2】:

    好的,所以你应该首先指定你想要的东西 - 像往常一样远离键盘,直到你完全知道你想要构建什么:

    • 读取到文件末尾或第一个新行
    • 跳过初始空白字符(可选但不贵)
    • 忽略尾随空白字符(可选但不昂贵)
    • 在第一个尾随空白之后拒绝任何非空白
    • 拒绝除空格、数字和点以外的任何字符
    • 处理整数部分(直到第一个点),但将当前值乘以 10 并添加字符代码减去 char '0'
    • 确保最多一个点
    • 通过添加 char - '0' 乘以 0.1 次幂小数位来处理小数部分

    一旦表明编码很简单,可能是:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    void error(int pos, char c) {
        fprintf(stderr, "Unwanted character %c at %d\n", c, pos);
        exit(1);
    }
    
    int main() {
        double f = 0.;
        int c;
        bool initial = 1, final=0;
        int pos = 0;
        double decimal = 0;
    
        while (((c = getchar()) != EOF) && (c != '\n')) {
            pos += 1;
            if (isspace(c)) { // accept spaces before and after the number
                if (initial || final) continue;
                else {
                    final = 1;
                    continue;
                }
            }
            else if (final) {  // do not accept anything after a space after the number
                error(pos, c);
            }
            initial = 0;     // at least one non blank char
            if (c == '.') {
                if (decimal) { // accept only one decimal dot
                    error(pos, c);
                }
                else decimal = 1;
            }
            else if (! isdigit(c)) { // only digits
                error(pos, c);
            }
            else if (decimal == 0) {
                f = f * 10 + c - '0';   // integer part
            }
            else {
                decimal *= .1;     // fractional part
                f += (c - '0') * decimal;
            }
        }
        printf("%.4f\n", f);
    
        return 0;
    }
    

    作为奖励,我向您展示了如何处理错误情况

    【讨论】:

      【解决方案3】:

      如果你先写一个读取整数的函数会更简单。

      那你可以考虑写一个读取小数部分的函数,合并结果。

      另外,你需要积累读取信息。目前,您正在用一个新的数字覆盖以前读取的数字。

      【讨论】:

        【解决方案4】:

        在解决任务时仅使用stdio 的另一种可能性是简单的两步过程:

        • 使用或多或少复杂的防呆方法将输入声明并读取到字符数组中
        • “解析”小数点左右两侧的数组成员,并将('0' 偏移减去的值)乘以相应的 10 次幂。

        _

        #include <stdio.h>
        
        int main(void)
        {
          float power_of_ten, num = 0.;
          char c, ch[32];
          int j, i = 0;
          int point_pos = -1; //initialize decimal point position 'offscale'
        
          while(((c = getchar()) != EOF) && (c != '\n')) //simple fool-proof check
            if(((c >= '0')&&(c <= '9')) || (( c == '.')&&(point_pos == -1))){
              ch[i] = c;
              if(ch[i] == '.') 
                  point_pos = i;
              i++;
              }
          ch[++i] = '\0'; //length of the array
          //parsing the array
          if(point_pos >= 0){  //to the right of decimal point
              power_of_ten = .1;
              for(j = point_pos + 1; j < i-1; j++){      
                  num += (float)(ch[j] - '0')*power_of_ten;
                  power_of_ten *= .1;
                  }
              }
        
          power_of_ten = 1.;   //to the left of decimal point
          if(point_pos == -1)point_pos = i-1;  
          for(j = point_pos - 1; j >= 0 ; j --){  
              num += (float)(ch[j] - '0')*power_of_ten;
              power_of_ten *= 10;
              }
        
           printf("%.4f\n", num); 
        
          return 0;
        }
        

        【讨论】:

          【解决方案5】:

          希望这会有所帮助!

          #include<stdio.h>
          #include<string.h>
          #include<math.h>
          int findNumOfDigits(int num);
          
          int main(void)
          {
              char c;
              float f, mod, fractional;
              char *buff = malloc(10), *fptr;
              char *str = buff;
              int digits;
              printf("Enter any number\n");
          
              c = getchar();
              while(c!='\n')
              {
                  *buff = c;
                  buff = buff+1;
                  c = getchar();
              }
              *buff = '\0';
          
              mod = atoi(str);
              fptr = strstr(str, ".");
              if(fptr!=NULL)
                  fptr++;
              fractional = atoi(fptr);
              digits = findNumOfDigits(fractional);
              f = (mod + (fractional/pow(10,digits)));
              printf("Number converted to float = %f", f);
          
              return 0;
          }
          
          int findNumOfDigits(int num)
          {
              int i;
              for(i = 1; num >= 10; i++)
              {
                  num = num/10;
              }
              return i;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-14
            • 1970-01-01
            • 1970-01-01
            • 2021-04-04
            • 1970-01-01
            • 2012-01-02
            • 2016-09-02
            相关资源
            最近更新 更多