我正在用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;
}
谢谢!
答案 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