我有这个代码将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;
}
Run Code Online (Sandbox Code Playgroud)
首先,你应该避免使用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;
}
Run Code Online (Sandbox Code Playgroud)