2014-02-26 183 views
1

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

#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

有代码和问题没有关系!!! – Jeyaram

+0

你遇到了什么问题,你已经有'scanf(“%d”...)'这将输入字符串转换为数字? – Arkku

+0

您的代码似乎“工作” - 它读取输入并生成输出。您可以考虑在'printf'语句的末尾添加'\ n'。什么不适合你?考虑使用8 * sizeof(int)-1'而不是'31'。您事先并不知道系统上有多大的int值。 – Floris

回答

2

跟进我提出的意见:

您的代码会出现在“工作” - 在它读取的输入,并产生 输出。您可能会考虑在您的printf 报表末尾添加\n。什么不适合你?考虑使用 8*sizeof(int)-1而不是31。您事先并不知道您的系统上有多大的int 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); 

要做转换。但是,如果你想打印为一个二进制文件,你需要从FL处理点转换为无符号整数 - 移位操作对于浮点数没有明确定义。所以

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打印出二进制数:如果你创建了一个工会,他们可能更喜欢它。它仍然是一个黑客...

+0

我知道它确实有效,但我给出的任务指定了用户输入需要是一个字符串......我知道,它很挑剔 – jordpw

+0

对不起,我误解了你的问题 - 让我更新。 – Floris

+0

请注意,如果使用'scanf()'时输入超出参数范围,则无法安全地从错误中恢复,因为超出范围的转换会导致未定义的行为(C.11第7.21.6.2节10)。 – jxh

0

只要使用atof。 cplusplus documentation

+0

不要使用'atof()',应该使用'strtod()'来代替。 –

+0

完全是主观的,在编码中没有绝对的。 strtod()确实更安全,但atof()仍然是他的问题的正确答案......如果您没有注意到,我确实添加了文档。 – JonPall

+0

我同意这是一个有效的答案,所以+1。但是,请注意'atof()'不会报告任何错误。 – jxh

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)。

+0

Upvoting提供了可靠的错误检查方法。如果用户可以输入垃圾,他们会 - 所以你最好确保你的代码可以应付。 – Floris

+0

想法:如果'buffer'的值为'“\ n”',这段代码不会抱怨。我认为'char * endptr; x = strtod(buffer,&endptr);如果(buffer == endptr)失败();'捕获全部是空格或'“”''的输入。 – chux

+0

@chux:感谢您的提示。 – jxh

1

简单scanf的例子与GCC 4.7.3测试

$ GCC -Wall -pedantic -Wextra -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; } 
+0

请注意,如果使用scanf()时输入超出参数范围,则无法安全地从错误中恢复,因为超出范围的转换会导致未定义的行为(C.11第7.21.6.2节第10段) 。 – jxh