1

我有一个使用 udp 发送的字符串。现在我想读取字符串,对其进行标记并将其保存到 char 数组中。仅保存每个单词的第一个字母。所以我只从 element01 到 element05 得到 5 'e's。我在 Arduino 工作,我知道一些 c#,但不知道 c 或 c++。

//p_params->packetBuffer contains the following string:
//element01#element02#element03#element04#element05

void packtStriper( receivedPacket * p_params )
{
  char delims[] = "#";
  char *result = NULL;
  int i = 0;

  //Tokenize string - 'split' it on hash mark
  result = strtok( p_params->packetBuffer, delims );

  //Iterate through the tokens and save them to my list
  while( result != NULL )
  {
    p_params->listData[i] = *result;
    i++;

    result = strtok( NULL, delims );
  }

  //Display the data just received
  for(int j =0; j<i; j++)
  {
    Serial.print( "Data " );
    Serial.print( j );
    Serial.print( ": " );

    Serial.println( p_params->listData[j] );
  } 
}

typedef struct receivedPacket
{
  char            * REQType;
  char            * confName;
  unsigned  int   confData[64];
  char            listData[10];
  char            packetBuffer[UDP_BUFFER_SIZE];
  int             packetSize;
  int             inProduction;

}receivedPacket;

由于以下代码打印了完整的元素名称,我认为我可以只使用结果。但这也会返回错误。

char str[] = "element01#element02#element03#element04#element05";
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
    printf( "result is \"%s\"\n", result );
    result = strtok( NULL, delims );
}
4

2 回答 2

3

以下行:

p_params->listData[i] = *result

获取 的第一个字符result,并将其复制到 的i第一个字符p_params->listData。所以只复制每个标记的第一个字符。您希望如何获得这些标记,作为 element01element02element03element04element05 的一个序列,或作为字符串数组?

请记住,在 C 和 C++ 中,一个字符数组只包含一个字符串,简单地说。要保存多个字符串,您需要一个字符数组或一些分隔符(这是您开始的地方......)。

编辑:

鉴于您想获得一个字符串数组,您可以使用以下内容:声明listData

char* listData[10];

这意味着listData现在最多可以容纳 10 个字符串。然后,而不是分配*resultlistData[i],使用以下内容:

p_params->listData[i] = strdup(result);

这将创建字符串的副本,并将其存储在下一个条目中。

笔记:

  1. 如果要显示字符串,则必须再次循环,并一一打印。你不能只打印它们的整个数组。
  2. strdup为你分配内存。完成这些字符串后,您必须free()使用它们。
  3. 您的代码使用幻数,这很糟糕。我假设这只是为了使它更容易在这里阅读;)
  4. 如果你得到超过 10 个元素,你会得到一个缓冲区溢出,因为listData最多只能容纳 10 个字符串。你至少应该确保i不超过 9while左右。
于 2011-09-05T12:39:48.263 回答
2

result是指向字符的指针(可以是字符数组中的元素),而*result是它指向的字符。所以这条线

p_params->listData[i] = *result;

正在将一个字符放入p_params->listData[i].

在 C 中,字符串由 char 类型的数组表示,通常以 null 结尾(即值 0)。听起来您需要一个字符串数组,您可以将其创建为二维数组。例如:

// 5 strings each with 9 characters and a null terminator
char ArrayOfStrings[5][10];

strcpy()然后,您可以使用orstrncpy()函数将一个标记复制到每个字符串中。为了安全起见,我建议您使用strncpy()(这样您复制的字符就不会超过您的空间),并手动将每个字符串的最后一个元素设置为 null。

于 2011-09-05T13:23:58.020 回答