【问题标题】:Conversion of decimal to string十进制到字符串的转换
【发布时间】:2020-02-19 07:15:08
【问题描述】:

我正在尝试将十进制值转换为字符串。我使用 STM32CubeIDE IDE,但收到类似 'Invalid binary operator' 之类的错误。我可以将&n 设置为十进制值3695。我需要将其转换为字符串。我该怎么做?

void main() 
{

    uint8_t TxArr;
    uint16_t Data;
    int a[10];
    int i;
   while (1)
   {
     HAL_I2C_Master_Transmit(&hi2c1,0x16, &TxArr, 1, 1000);
     HAL_I2C_Master_Receive(&hi2c1, 0x17, &Data, 2, 1000);
     for(i=0;i<4;i++)
      {
      a[i]=Data%10+0x30;     //value in Data is 3695.
      Data=Data/10;
      HAL_UART_Transmit(&huart3, a[i], 11, 100);
      HAL_Delay(300);
      }

      }

【问题讨论】:

  • 请正确格式化您的代码,这只是不可读。 (提示可能是混合制表符和空格)
  • @TarickWelling,感谢您的回复先生。我第一次在这种环境下提出问题,很抱歉在编写代码时犯了错误。现在我编辑了它,请检查一次。

标签: c stm32 keil


【解决方案1】:

错误产生于:

n = n / 10;

如果n 是一个指针 (int* n) 会发生什么,它会将n 重新指向原始数字十分之一的位置。 You will need to begin using normal array operators if you want your code to work properly.

您遇到的第二个问题如下: 您将 n 声明为 10 个整数类型的数组,并使用 int

int n[10];

然后在你的 for 循环中你尝试这样做:

n > 0; 

这是一个无效操作,因为n 将衰减为指针,因此您的数组地址将与0 进行比较。这将始终评估为 TRUE!

将整数转换为字符串(字符数组)的好方法是this answer。 在你的情况下,这将是

int yourToBeConvertedNumber;
char str[INT_MAX]; // or any other reasonable upper bound you have set for the input data.
snprintf(str, sizeof(str), "%d", yourToBeConvertedNumber);

【讨论】:

  • str[INT_MAX]; - 这是创建一个非常非常大的字符串。您不想要INT_MAX 字节,您需要足够的字节来以base-10 表示形式存储INT_MAX,即log10(INT_MAX),这对于32 位int 来说就像10 个字符。所以char str[11] 就够了。
  • @KamilCuk 随时添加到帖子中。这只是一小段代码,至少没有缓冲区溢出。但是是的INT_MAX 是相当愚蠢的。
  • @Tarick Welling,感谢您的回复先生。我使用了这个 snprintf(str, sizeof(str), "%d", yourToBeConvertedNumber);但它只是显示 ASCII 值,我想在 matlab 中传输这个 ASCII 值,因为我们必须将这个值存储在一个数组中,我该怎么做呢?
  • 当然会显示垃圾。 0x30 + 9 是什么,0x30 + 10 有什么不同?您没有阅读/做答案的最后一部分
  • @Tarick Welling,感谢您的快速响应,先生,0x30+9 这是为了获取 9 的 ascii 值。最初我得到像 3695 这样的十进制值,并通过分隔每个数字将每个数字转换为 ascii。
【解决方案2】:

一般来说,要将整数转换为字符串,可以使用sprintf 函数。它应该在 newlib 甚至 newlib-nano 标准 C 库中可用。

但是我的猜测是你有一个整数数组,其中每个元素都是 0 到 9 之间的数字?

如果这是真的,您有几个问题:您似乎将变量 n 处理为整数而不是地址。此外,您的字符串应该是一个更长的元素并由字符组成。

你可以这样做:

char a[11];
for(i=0;i<10;i++)
{
   a[i]=n[i]%10 +'0'; 
}
a[11]='\0';

【讨论】:

  • @Petitjean 感谢您的回复先生,我参考您的建议并对我的代码进行了一些更改,如上所述,请检查一次并纠正我。通过此代码,我得到每个数字的 ascii 值并存储在一个数组中,但是当我尝试在超级终端或码头灯上检查它时,它显示垃圾值。先生有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2013-09-05
  • 2021-03-19
  • 2016-12-27
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多