C 字符数组,奇怪的字符

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

我正在为我正在进行的一个项目使用C进行实验,其想法是在RX缓冲区(接收到的数据,本例中指向字符串的指针)上循环,并解析出所有命令代码

命令的结构:

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