C 字符数组,奇怪的字符
我正在为我正在进行的一个项目使用C进行实验,其想法是在RX缓冲区(接收到的数据,本例中指向字符串的指针)上循环,并解析出所有命令代码 命令的结构:C 字符数组,奇怪的字符,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,我正在为我正在进行的一个项目使用C进行实验,其想法是在RX缓冲区(接收到的数据,本例中指向字符串的指针)上循环,并解析出所有命令代码 命令的结构: |COMMAND/CHECKSUM# 因此|字符表示数据块的开始,后面是命令,而不是/字符,它将命令与校验和分开,然后#字符表示数据块的结束 一切似乎都很正常,下面是完整的代码: #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #in
|COMMAND/CHECKSUM#
因此|字符表示数据块的开始,后面是命令,而不是/字符,它将命令与校验和分开,然后#字符表示数据块的结束
一切似乎都很正常,下面是完整的代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void append(char *s, char c)
{
int len = strlen(s);
s[len] = c;
s[len+1] = '\0';
}
int getPayload(char *RXbuf, char *rxPayload, char *rxChecksum)
{
int started = 0;
int separated = 0;
int parsedLength = 0;
int len = strlen(RXbuf);
if (RXbuf[0] == '#')
{
parsedLength++;
}
for (int i = 0; (i < len && RXbuf[i] != '#'); i++)
{
parsedLength++;
if (started == 0 && RXbuf[i] == '|')
{
started = 1;
continue;
}
if (RXbuf[i] == '/')
{
separated = 1;
continue;
}
if (started == 1)
{
if (separated == 0)
{
append(rxPayload, RXbuf[i]);
}
else
{
append(rxChecksum, RXbuf[i]);
}
}
}
return parsedLength;
}
int main()
{
char *RXbuf = "|SR-5632-LED-0002/412215590#dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#";
printf("RX Data: %s\n", RXbuf);
printf("##############################################################################################################################\n");
while(1)
{
char rxPayload[50];
char rxChecksum[20];
int started = 0;
int stopped = 0;
int separated = 0;
int parsedLength = getPayload(RXbuf, rxPayload, rxChecksum);
if (strlen(rxPayload) > 10)
{
printf("-----------------------------------------------------------------------------------------------------------------\n");
printf("RX Data: %s\n", RXbuf);
printf("%s/%s\n", rxPayload, rxChecksum);
printf("\n");
printf("-----------------------------------------------------------------------------------------------------------------\n");
}
RXbuf = RXbuf + parsedLength;
rxPayload[0] = 0;
rxChecksum[0] = 0;
if (parsedLength == 0)
{
break;
}
}
printf("\n");
printf("##############################################################################################################################\n");
}
我认为这与字符数组rxPayload&rxChecksum的指针有关,但我不知道在这种情况下如何修复它。它们现在被设置为[50]和[20]的字符数组,但理想情况下,它们会有一个动态大小,这样我就可以有长的命令代码,包括几个参数,一些关于这方面的帮助也是非常受欢迎的!但是奇怪的角色是主要的问题
我做错了什么,我能做些什么来改进它?在安全地附加到字符串变量之前,需要初始化字符串变量
char rxPayload[50] = "";
char rxChecksum[20] = "";
或者你可以移动这两条线:
rxPayload[0] = 0;
rxChecksum[0] = 0;
在调用
getPayload()
之前,在调用getPayload
之前,您从未初始化过rxPayload
和rxChecksum
。因此,您将附加到未初始化的字符串。谢谢!原谅我犯的愚蠢的错误,那似乎可以解决它!有没有办法让它更有活力?因此,不要限制自己的rxPayload为50个字符,例如?使用malloc
和realloc
。非常感谢Barmar!它不应该是rxPayload[0]={0}@Khan No.rxPayload
是一个字符数组,所以rxPayload[0]
是char
。哦,是的,我忽略了它,我想的更像rxPayload[]={0};
rxPayload[0] = 0;
rxChecksum[0] = 0;