在实际中经常会遇到将字符串转换为数字的情况,那么怎么才能实现呢?下面探讨一下:
我们知道,数字既能以字符串形式存储也能以数字形式存储,以数字形式存储的形式就是存储数字字符。如123能以'1','2','3','\0'形式存储,也可以直接123的int形式存储。
对于数字运算,C要求是数组形式。但是要在屏幕上显示数字去人必须是字符。printf和sprintf使用%d或者%s实现字符串和数字之间的转换,但是在C中还有一些专门的函数可以使用。假设你想将一个字符串转换为一个整型数字,那么你可以使用atoi()函数。如:
#include <stdio.h>
#include <stdlib.h>
int main (int argc,char *argv[])
{
int i,times;
if (argc<2 || (times=atoi(argv[1]))<1)
{
printf ("Usage:%s needs positive-number\n",argv[0]);
}
else
{
for (i=0;i<times;i++)
{
printf ("Hello,good looking!\n");
}
}
}
下面是一个运行结果:
#hello 3
#Hello,good looking!
#Hello,good looking!
#Hello,good looking!
程序中使用atoi函数将命令行输入的字符串“3\0”转换为数字3,然后赋值给times,最后循环打印times次。并且,如果命令行没有提供参数,或者times为零或者负数,就会报错。那么如果字符串只是以一个数字开头atoi任然可以正确执行,他将前部分的数字转换为数字。如果全部是字符呢?这个时候,atoi函数会返回一个0值。但是ANSI标准规定,上述情况下的行为是未定义的。稍后我们将介绍strtol()函数,提供更可靠的错误检测。
我们包含了stdlib.h这个文件,因为ANSI在这个文件中定义了atoi函数,当然这个文件里面还定义了很多函数,这里就不一一详述了。
ANSI C提供了这些函数的更复杂版本:strtol(),strtoul(),strtod(),其中strtol()是将一个字符串转换为一个longx型的数字,strtoul()转换为unsigned long型的数字,而strtod()转换为一个double型的数字,这些函数的复杂性在于他们还可以识别并报告非数字部分的第一个字符。strtol()和strtoul()还可以指定基数。这里以strtol为例:
原型:long strtol(const char *nptr,char **endptr,int base)
在这里,nptr指向你想转换的字符串,endptr是函数返回的一个指向数字结束的指针的指针,base是一个基数,可以指定。
应用实例:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char number[30];
char *end;
int value;
printf ("请输入字符串(直接键入回车退出):\n");
while (gets (number) && number[0]!='\0')
{
value=strtol(number,&end,10);
printf ("value:%ld stoped at %s(%d)\n",value,end,*end);
value=strtol(number,&end,16);
printf ("value:%ld stoped at %s(%d)\n",value,end,*end);
printf ("请继续输入:\n");
}
printf ("再见!\n");
return 0;
}
下面是输出实例:
[root@CentOS 桌面]# ./strtoa
请输入字符串(直接键入回车退出):
10
value:10 stoped at (0)
value:16 stoped at (0)
请继续输入:
10atom
value:10 stoped at atom(97)
value:266 stoped at tom(116)
请继续输入:
再见!
注意到,这里由于指定的基数不同,所以同一个数字的输出不一样。
这里提醒一下,strtol()最多可以36进制,strtoul()也是一样。strtod()只是十进制的转换,因此他只有两个参数。
现实中都用itoa()和ftoa()函数整数和浮点数转换为字符串,。但是这两个函数不是ANSI C库里面的函数;如果要求兼容性更好,可以使用sprintf()函数来实现。