C将字符串/字符输入转换为浮点数

时间:2014-02-26 02:13:35

标签: c string floating-point

我正在用C编写程序,其中一个要求是用户输入一个数字作为字符串值,然后程序必须将其转换为浮点格式,然后对该值执行各种操作。我似乎无法弄清楚如何简单地将输入字符串转换为数字。我该如何编写第一块代码呢?我知道有类似的帖子,但他们没有帮助。我需要相当简单地做到这一点,而且除了......之外我不想#include任何东西。

#include <stdio.h>

int main(int argc,char* argv[]) { 
  /*having issues with this in particular...*/

  int number;    
  int newNumber;
  int i;
  printf("Enter a number in decimal...");
  scanf("%d",&number);

  /*                        */

  printf("%d in binary is: ",number);
  for(i = 31;i >= 0;i--) {
    newNumber = (number>>i);
    if(newNumber & 1) {
      printf("1");
    }
    else {
  printf("0");
}
   }  


  return 0;
}

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用strtod()。将数字作为字符串读入缓冲区(例如使用fgets()),然后执行:

double x;
char *endptr;
errno = 0;
x = strtod(buffer, &endptr);
if (endptr == buffer) {
    //... parse error or empty input ...
} else if (*endptr != '\n' && *endptr != '\0') {
    //... parse error extraneous data ...
} else if ((x == HUGE_VAL || x == -HUGE_VAL) && errno != 0) {
    //... error overflow ...
} else if (x <= DBL_MIN && x >= -DBL_MIN) {
    if (errno != 0) {
        //... error underflow (detected) ....
    } else {
        // ... underflow still possible, but is undiagnosed ...
    }
}

通过检查x返回的值以及errno是否已设置来完成错误检查。通过检查endptr来完成解析错误。 C标准表示下溢检测是实现定义的(C.11§7.22.1.3¶10)。

答案 1 :(得分:2)

跟进我的评论:

  

您的代码似乎“正常工作” - 因为它读取输入并生成   输出。您可以考虑在\n的末尾添加printf   声明。究竟什么不适合你?考虑使用   8*sizeof(int)-1而不是31。你提前不知道有多大   你的系统上有一个int。

通过微小的更改,您的代码对我非常有用:

#include <stdio.h>

int main(int argc,char* argv[]) {
  /*having issues with this in particular...*/

  int number;
  int newNumber;
  int i;
  printf("Enter a number in decimal...\n"); // <<< added a newline
  scanf("%d",&number);

  /*                        */

  printf("%d in binary is: ",number);
  for(i = sizeof(int)*8 - 1;i >= 0;i--) {  // make sure `i` starts with the right size
    newNumber = (number>>i);
    if(newNumber & 1) {
      printf("1");
    }
    else {
      printf("0");
    }

  }

  printf("\n");  // <<< print a newline

  return 0;
}

当我运行它时:

Enter a number in decimal...
123
123 in binary is: 00000000000000000000000001111011

注意 - 您必须输入一个整数才能生效。如果您需要您的代码对输入中的用户“错误”更加健壮,那么最好的办法是将输入作为字符串读取,然后再进行一些解析。例如:

char buffer[100];
printf("enter an integer:\n");
fgets(buffer, 100, stdin);
// now you can look for spaces, letters, anything you want to skip, in the string
// you could even use sscanf().
// scanf() is a terribly fragile function to use, especially with "free form user input".
if(sscanf(buffer, "%d", &number) == 1) {
  // successfully converted number... run your code
} else {
  printf("unable to convert input to a number!\n%s\n", buffer);
  return 0;
}

另一个注释重新阅读你的问题,你说“程序必须转换为浮点号码。这意味着你应该这样做

float fnumber;
sscanf(buffer, "%f", &fnumber);

double dnumber;
sscanf(buffer, "%lf", &dnumber);

进行转换。但是,如果要打印为二进制,则需要将数字从浮点数转换为无符号整数 - 对于浮点数,没有明确定义位移操作。所以

unsigned int *intPtr, number;
intPtr = (unsigned int*) *fnumber; // this is hairy but it works
number = *intPtr;

现在像以前一样使用number - 您将能够打印出浮点数的二进制等价物。有些人会抱怨上述内容并非“符合标准”。如果你创建了一个联盟,他们可能更喜欢它:

union f2i
{
  float fvalue;
  unsigned int ivalue;
} Values;

然后将输入分配给Values.fvalue,并使用Values.ivalue打印出二进制数。它仍然是一个黑客......

答案 2 :(得分:1)

使用GCC 4.7.3测试的简单scanf示例

$ gcc -Wall -Wextra -pedantic -std = c99 cstring-double.c

#include <stdio.h>

int main() {
  double v;
  int err;

  err = scanf("%lf", &v);
  if (1 == err) {
    printf("%lf\n", v);
  } else {
    printf("read failed\n"); }

  return 0; }

答案 3 :(得分:0)

只需使用atof。 cplusplus documentation