我正在尝试组成一个字符串(恰好是char数组),其中包含固定的14个起始字符,并以不同的内容结束。可变位包含2个浮点数和1个32位整数,它们在数组中分别被视为4个逗号分隔的1字节字符。可以通过下面的代码来说明这一点,由于一些显而易见的原因(*char不能赋值给*float),这段代码不能编译。那么,我能做些什么来绕过它呢?
char *const comStr = "AT+UCAST:0000=0760,0020,0001\r"; // command string
float *pressure;
float *temperature;
uint32_t *timeStamp;
pressure = comStr + 14; // pressure in the address following the '=' in command string
temperature = comStr + 18; // temperature in the address following the 1st ',' in command string
timeStamp = comStr + 22; // time stamp in the address following the 2nd ',' in command string我对C语言中的结构和联合之类的东西记忆不清,它们严格地保留了变量在“结构”中定义的内存分配顺序。可能是这样的:
typedef struct
{
char[14] command;
float *pressure;
char comma1;
float *temperature;
char comma2;
uint32_t *time_stamp;
char CR;
}comStr;这个结构能保证comStr-> command15给我压力的第一个/最后一个字节(取决于字节顺序)吗?或者,有没有其他特殊的结构让我看不到呢?
(注意: comStr-> command15将不会在未来的代码中进行计算,因此这里不需要考虑超过索引边界。这里唯一重要的是内存是否被连续分配,以便从内存地址(comStr->命令)开始持续29个字节的硬件获取恰好得到我想要的字符串。
附注:当我写这篇文章的时候,我想出了一个主意。我能不能只使用memcpy()来实现这个目的;) memcpy有void*类型的参数,希望它能工作!我现在就要试一下!无论如何,stackOverflow万岁!
编辑:我应该让自己更清楚,对于任何误导和误解,我深表歉意!我要构造的字符数组将通过UART逐字节发送。为此,如果将字符数组的起始存储器地址和长度给定给DMA系统,则将使用DMA系统将数组逐字节地自动传送到发送缓冲器。因此,字符数组必须连续存储在内存中。我希望这能让问题变得更清楚。
发布于 2013-04-14 11:54:57
在你的问题中涉及到的各种问题。我将尝试解决其中的一些问题。
char *p= "125";
P将不包含0。它将包含'0‘-如果编码是ASCII,那么它将是48。也就是说,p将包含48 &而不是0。p1将包含49,p2将包含52。float的情况与此类似。
相反的情况也会发生。也就是说,如果你有一个地址,并且你把它当作一个char数组-- char数组将不会包含你认为它会包含的浮点数。请尝试此程序查看以下内容
#include <stdio.h>
struct A
{
char c[4];
float * p;
int i;
};
int main()
{
float x = 1.25;
struct A a;
a.p = &x;
a.i = 0; // to make sure the 'presumed' string starting at p gets null terminate after the float
printf("%s\n", &a.c[4]);
}对我来说,它打印的是"╪·↓“。这与字符顺序无关。
另外,您是否正在尝试创建char数组或解析已经存在的char数组。如果您正在尝试创建它,一种更好的方法是使用snprintf来做您想做的事情。snprintf使用类似于printf的格式说明符,但打印到字符数组。您可以通过这种方式创建char数组。还有一个更大的问题--您计划如何处理您创建的这个char数组--这将决定字节序是否与您相关。
如果您试图从给定的字符数组中读取数据,并试图将其拆分为浮点数和逗号等,那么一种方法是sscanf,但对于您的特定字符串格式来说可能比较困难。
https://stackoverflow.com/questions/15995507
复制相似问题