将ASCII字符串转换为int / float / long

时间:2014-08-01 17:13:55

标签: c

我有这个代码将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;
}

3 个答案:

答案 0 :(得分:5)

首先,你应该避免使用ato*函数(即:atoiatof等),因为有些情况下转换失败,它只返回零,所以你无法知道输入是否真的是一个表示零的字符串,或者是否是由于处理错误。例如,如果您修改下面的示例,并将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)

请不要使用ato*函数,ato*函数已被strto*弃用,不应在新代码中使用。

ato*的问题是,如果转换后的值超出范围,则会导致 未定义的行为

有关详细信息,请查看here.