C 从字符数组转换为16位有符号整数和32位无符号整数

C 从字符数组转换为16位有符号整数和32位无符号整数,c,types,embedded,string-conversion,C,Types,Embedded,String Conversion,我正在为我开发的PCB开发一些嵌入式C,但是我的C有点生锈了 我想做一些从字符数组到各种整数类型的转换 第一个例子: [input] " 1234" (note the space before the 1) [convert to] (int16_t) 1234 第二个例子: [input] "-1234" [convert to] (int16_t) -1234 [input] "2017061234" [convert to] (u

我正在为我开发的PCB开发一些嵌入式C,但是我的C有点生锈了

我想做一些从字符数组到各种整数类型的转换

第一个例子:

[input]        " 1234" (note the space before the 1)
[convert to]   (int16_t) 1234
第二个例子:

[input]        "-1234"
[convert to]   (int16_t) -1234
[input]        "2017061234"
[convert to]   (uint32_t) 2017061234
第三个例子:

[input]        "-1234"
[convert to]   (int16_t) -1234
[input]        "2017061234"
[convert to]   (uint32_t) 2017061234
我尝试过使用atoi(),但似乎没有达到预期的效果。有什么建议吗

[编辑]

这是转换的代码:

char *c_sensor_id = "0061176056";
char *c_reading1 = " 3630";
char *c_reading2 = "-24.30";

uint32_t sensor_id = atoi(c_sensor_id); // comes out as 536880136
uint16_t reading1 = atoi(c_reading1); // comes out as 9224
uint16_t reading2 = atoi(c_reading2); // comes out as 9224

尝试如下初始化字符串:

char c_sensor_id[] = "0061176056";
char c_reading1[] = " 3630";
char c_reading2[] = "-24.30";
有几件事:

  • 切勿使用
    atoi
    函数系列,因为它们没有错误处理,如果输入格式不正确,可能会崩溃。相反,请使用
    strtol
    函数系列
  • 在资源受限的微控制器上,这两种功能中的任何一种都会占用大量资源。您可能需要推出自己版本的
    strtol
例如:

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>

int main() 
{
  const char* c_sensor_id = "0061176056";
  const char* c_reading1  = " 3630";
  const char* c_reading2  = "-1234";

  c_reading1++; // fix the weird string format

  uint32_t sensor_id = (uint32_t)strtoul(c_sensor_id, NULL, 10);
  uint16_t reading1  = (uint16_t)strtoul(c_reading1,  NULL, 10);
  int16_t  reading2  = (int16_t) strtol (c_reading2,  NULL, 10);

  printf("%"PRIu32 "\n", sensor_id);
  printf("%"PRIu16 "\n", reading1);
  printf("%"PRId16 "\n", reading2);

}

观察到的行为非常令人惊讶。我建议编写函数将字符串转换为
int32\u t
uint32\u t
,并使用它们代替
atoi()

uint32\u t原子32(常量字符*s){
uint32_t v=0;
而(*s=='')
s++;

然而(*s>='0'&&*s这在规范方面还不太清楚。可能的整数类型列表是什么,以及它们应该应用的顺序?什么是“玩弄”意味着什么?你得到了什么?你期望得到什么?你应该展示你的代码。抱歉-匆忙写下了这篇文章!)我已经添加了代码和我得到的输出。
uint16\u t reading2=..“-24.30”
对您有什么意义?观察到的行为与您发布的代码片段不一致。请发布完整的程序及其输出,以便我们确定出了什么问题。是否要详细说明?