C char数组,奇怪的字符

时间:2014-12-11 09:52:58

标签: c arrays string pointers char

我正在尝试使用C来处理正在进行的项目,我的想法是循环一个RX缓冲区(接收数据,在这种情况下指向字符串的指针)并解析出所有命令代码。

命令的结构:

|COMMAND/CHECKSUM#

所以| character表示数据块的开头,后跟命令,而不是将命令与校验和分开的/字符,然后是#字符,表示数据块的结束。

一切似乎都运转正常,这里是完整的代码:

#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");
}

它编译好,它运行没有错误,但输出不是我期望的。它循环并解析命令,但与第一个命令一起输出一些奇怪的字符,如上面程序的输出中所示:

$ ./rxdestruct
RX Data: |SR-5632-LED-0002/412215590#dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#
##############################################################################################################################
-----------------------------------------------------------------------------------------------------------------
RX Data: |SR-5632-LED-0002/412215590#dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#
���\�SR-5632-LED-0002/412215590

-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
RX Data: dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#
SR-5632-LED-0002/412215590

-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
RX Data: dsf|SR-5632-LED-0002/412215590#
SR-5632-LED-0002/412215590

-----------------------------------------------------------------------------------------------------------------

##############################################################################################################################

我认为这与char数组rxPayload&amp;的指针有关。 rxChecksum但我不知道在这种情况下如何解决它。现在将它们设置为[50]和[20]的char数组,但理想情况下这些将具有动态大小,因此我可以使用包含多个参数的长命令代码,对此的一些帮助也非常受欢迎!但奇怪的角色是主要问题。

我做错了什么,我该怎么做才能改善它?

1 个答案:

答案 0 :(得分:2)

您需要初始化字符串变量,然后才能安全地附加到它们。

  char rxPayload[50] = "";
  char rxChecksum[20] = "";

或者你可以移动这两行:

  rxPayload[0] = 0;
  rxChecksum[0] = 0;
在致电getPayload()之前