我有这个代码将ASCII字符串转换为int,float或double。但是,它为所有这些打印“42”。我哪里做错了?语法看起来正确,没有警告。
#include <stdlib.h>
int main(void)
{
char *buf1 = "42";
char buf2[] = "69.00";
int i;
double d;
long l;
i = atoi(buf1);
l = atol(buf1);
d = atof(buf2);
printf("%d\t%d\t%d\n", i, l, d);
return 0;
}
答案 0 :(得分:5)
首先,你应该避免使用ato*
函数(即:atoi
,atof
等),因为有些情况下转换失败,它只返回零,所以你无法知道输入是否真的是一个表示零的字符串,或者是否是由于处理错误。例如,如果您修改下面的示例,并将buf2
更改为"z16"
,您将收到可以处理的警告。 atoi
不会让您知道该错误。
其次,您的printf
电话中的格式说明符不正确。您的编译器应该已经生成了关于此的警告。
请参阅下面的示例,了解包含转换错误处理的工作版本。并非在我的示例中将strtol
显式转换为(int)
确实允许潜在的整数溢出。尝试将buf1
设为大数字,看看会发生什么。
代码清单
#include <stdio.h> /* printf */
#include <stdlib.h> /* strtox */
#include <errno.h> /* error numbers */
#define BASE (10) /* use decimal */
int main(void) {
char* errCheck;
char *buf1 = "42";
char *buf2 = "16";
char buf3[] = "69.00";
int i;
double d;
long l;
/* Handle conversions and handle errors */
i = (int)strtol(buf1, &errCheck, BASE);
if(errCheck == buf1) {
printf("Conversion error:%s\n",buf1);
return EIO;
}
l = strtol(buf2, &errCheck, BASE);
if(errCheck == buf2) {
printf("Conversion error:%s\n",buf2);
return EIO;
}
d = strtod(buf3, &errCheck);
if(errCheck == buf3) {
printf("Conversion error:%s\n",buf3);
return EIO;
}
printf("%d\t%ld\t%lf\n", i, l, d);
return 0;
}
答案 1 :(得分:2)
更改
printf("%d\t%d\t%d\n", i, l, d);
到
printf("%d\t%ld\t%f\n", i, l, d);
答案 2 :(得分:1)