我用KEIL编C语言的程序,用到了一个atoi函数,但在LCD上显示不出来,如果不用atoi,可以显示字符串里的数

因为我想显示的是十进制的数,所以字符型的是不可以的,各位帮帮忙,初学编程,在线等,谢谢各位,这是我用到的函数的程序,LCD的都没问题
void MMSI()
{
int mmsi;
char str[4]={"a142"};
mmsi=atoi(str);
while(1)
{
lcd_pos(1,0);
lcd_wdat(mmsi); //如果这个括号里是身str[0]是能显示出来字符a的
}
}

第1个回答  2012-05-20
因为不清楚你的具体需求,不好回答。
我首先假设内存足够大(至少1K),不是特别差的51、31系列单片机。
需求是把a142这个16进制数?转换成10进制数输出?
前面
char str[4]={“a142"};是完全错误的
应当是 char str[]="a142"; 或者 char str[5]="a142";
后面
最简单的就是
sscanf(str, "%x", &mmsi); /* 取出值 */
char buf[10]; /*看具体长度*/
sprintf(buf, "%d", mmsi); /* buf 里面变成了 41282,也可能是负数,这个看int范围 */
lcd_wdat(buf);追问

内存够大的,用的51,是将a124这个十六进制化成十进制显示在LCD上
但是我按要求改了,LCD上怎么显示了一个 ( 就是么都没有了
是这样改吧
void MMSI()
{
int mmsi;
char str[]="a142";
char buf[10];
mmsi=atoi(str);
sscanf(str, "%x", &mmsi);
sprintf(buf, "%d", mmsi);
while(1)
{
lcd_pos(1,0);
lcd_wdat(buf);
}
}

追答

我主要是没有太多时间,所以我一般都是告诉方法,以后你们自己研究。
授人以鱼 不如 授人以渔
void MMSI()
{
int mmsi;
int tmp;
char str[]="a142";
char buf[10];
/* mmsi=atoi(str); */ 不需要了
sscanf(str, "%x", &mmsi);
sprintf(buf, "%d", mmsi);
tmp=0;
while(buf[tmp])
{
lcd_pos(1, tmp);
lcd_wdat(buf[tmp]);
tmp++;
}
while(1);
}

追问

不好意思还有一个问题,我后来也知道不要atoi这个函数了,然后偶就是我的LCD显示需要移位,不过可能是我最开始问错了,我的那个a142是字符串不是十六进制,是四个ASCII码字符,这样是将%x改为%s就可以了吗?但是我发现这样的话buf的大小定义的不一样结果显示的也不一样,那么在定义buf时它的大小该怎么定义才能正确呢,谢谢

追答

buf要大于字符串最大长度,比如最长的是123456789,那么buf就取10就可以。
你说的ascii字符我不明白,如果就是最后缺'\0',你可以给它补上'\0'。
类似:
buf1[5];
buf1[0]=str[0];
buf1[1]=str[1];
buf1[2]=str[2];
buf1[3]=str[3];
buf1[4]=0;
sscanf(buf1, "%x", &mmsi);
不补充0的不是字符串,库函数除memcpy、memmove、strncpy等,最好不要使用。
这么写程序,完全是错误的种子。
慢慢学习吧,语言描述水平也需要提高,我回答完全靠猜,这个回答难度有点儿高。
也是浪费时间。
如果str不是字符串,atoi(str),是完全错误的,在PC机上引起系统崩溃,在嵌入式系统上随即引起不确定的问题。我一开始根据你使用了atoi和str的命名估计的str为字符串。
同理,如果不是字符串,sscanf同样不适用,%s的含义完全不正确。
字符串必须是最后一个字符是0('\0'或者NUL)。只要是C语言字符串函数,必须保证参数是字符串。

本回答被提问者采纳
相似回答