我正在使用 RS232 串行通信来旋转电机。串行通信是在字符串中完成的,但我需要十进制值。任何线索如何继续。我正在用 c 语言编码。我尝试使用 atoi 函数,但它不起作用。
char *p;
int z=atoi(p);
我正在使用 RS232 串行通信来旋转电机。串行通信是在字符串中完成的,但我需要十进制值。任何线索如何继续。我正在用 c 语言编码。我尝试使用 atoi 函数,但它不起作用。
char *p;
int z=atoi(p);
使用strtoXXX()
函数族。如果您需要int
,long
或long long
它们的未签名变体:
long l = strtol("1234567", NULL, 10);
long long ll = strtoll("1234567", NULL, 10);
unsigned long l = strtoul("1234567", NULL, 10);
如果你需要一个float
, double
, 或者long double
使用这个:
float f = strtof("3.1415927", NULL);
double d = strtod("3.1415927", NULL);
通常给出一个字符串:
char * myStr= "123";
将其值作为 int 获取的方法是:
int value=atoi(myStr);
需要注意的一些重要事项:
以下包括是必要的:
#include <stdlib.h>
并且您必须确保您的字符串是一个以空字符结尾的字符串,否则 atoi 会使您的程序崩溃。
您没有给我们太多信息,但如果您正在编写微控制器(我怀疑因为您告诉我们电机),您可能不想使用 stdlib。在这种情况下,您可能已经使用了 costum 函数。
请看下面的代码:
int stringToInt(char* nrStr){
int nrChars=0;
while(nrStr[nrChars]!='\0'){
nrChars++;
}
int result=0;
int i=0;
while(nrStr[i]!='\0'){//while you dont get to the end of the string
int digit=nrStr[i]-48;//48 is zero ascii code
int exp=nrChars-i-1;
int add=digit*power(10,exp);
result+=add;
i++;
}
return result;
}
int power(int base, int exp){
int ret=1;
int i;
for(i=0;i<exp;i++){
ret*=base;
}
return ret;
}
这不使用任何库函数并完成工作。我已经在 3 分钟内完成了它,它可能有一些小错误,它不是很有效并且不会验证可能的错误,但原则上如果你将一个格式良好的整数作为空终止字符串传递给 strinToint 函数,它将输出正确的价值。
如果您使用的库确实具有某种幂函数实现,请使用它而不是我给您的库,因为它根本没有效率。
最后一点:如果您出于某种原因需要在其他基础上使用它,比如说八进制,您必须选择以下行:
int add=digit*power(10,exp);
至:
int add=digit*power(8,exp);
对于十六进制,这将不起作用,并且此类功能的实现将有很大不同。