【问题标题】:conversion of string to decimal字符串到十进制的转换
【发布时间】:2013-04-16 17:30:25
【问题描述】:

我正在使用 RS232 串行通信来旋转电机。串行通信是在字符串中完成的,但我需要十进制值。任何线索如何继续。我正在用 c 语言编码。我尝试使用 atoi 函数但它不起作用。

char *p;

int z=atoi(p);

【问题讨论】:

  • 你能发布一些你的代码吗?

标签: c string serial-port decimal


【解决方案1】:

使用strtoXXX() 系列函数。如果您需要intlonglong long 或它们的无符号变体:

long l = strtol("1234567", NULL, 10);
long long ll = strtoll("1234567", NULL, 10);
unsigned long l = strtoul("1234567", NULL, 10);

如果您需要 floatdoublelong double,请使用:

float f = strtof("3.1415927", NULL);
double d = strtod("3.1415927", NULL);

手册herehere

【讨论】:

  • 实际上微控制器不接受这个。我们需要给电机旋转的十进制值。这个十进制值应该通过gui串行通信。
  • @user1437027 1. 这句话的任何部分都没有意义。 2.“单片机不接受”是怎么回事?
  • 微控制器不会接受字符串来运行电机。即使它接受它也会是 ascii 或一些垃圾值。它需要一些十进制值。
  • @user1437027 你一直在谈论的“十进制值”是什么?如果字符串格式不合适,请将其存储为整数(我在此处显示的内容)。或者还需要什么,真的吗?
  • 好的。我通过串行通信通过 gui 向电机发送命令。现在微控制器将在接收缓冲区中接收一些字符串。但是我们不能使用这个字符串值来运行电机。这里我们需要将字符串转换为十进制。这个十进制值将被赋予电机转动一定程度。我希望我能说清楚。*串行通信总是在字符串中。*
【解决方案2】:

通常给定一个字符串:

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);

对于十六进制,这是行不通的,这样一个函数的实现会有很大的不同。

【讨论】:

  • 是的,数据很好,但字符串没有给出确切的 ascii 值。它在转换后显示一些垃圾值,因为它是一个字符常量。
猜你喜欢
  • 2020-02-19
  • 2013-09-05
  • 2021-03-19
  • 2016-12-27
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多