如何将字符串标记保存到char变量?

如何将字符串标记保存到char变量?,c,char,arduino,strtok,C,Char,Arduino,Strtok,我有一个使用udp发送的字符串。现在我想读取字符串,对其进行标记并将其保存到char数组中。只保存每个单词的第一个字母。所以我从element01到element05得到了5'e。我在ARDUNO工作,我知道一些C,但是没有C或C++。 //p_params->packetBuffer contains the following string: //element01#element02#element03#element04#element05 void packtStriper(

我有一个使用udp发送的字符串。现在我想读取字符串,对其进行标记并将其保存到char数组中。只保存每个单词的第一个字母。所以我从element01到element05得到了5'e。我在ARDUNO工作,我知道一些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;
以下一行:

p_params->listData[i] = *result
获取结果的第一个字符,并将其复制到p_params->listData的第i个字符。因此,只复制每个令牌的第一个字符。您希望如何获取这些标记,作为一个element01element02element03element04element05序列,还是作为一个字符串数组

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

编辑:

如果希望获得字符串数组,可以使用以下命令:将listData声明为

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

p_params->listData[i] = strdup(result);
这将创建字符串的副本,并将其存储在下一个条目中

注:

如果要显示字符串,必须再次循环,并逐个打印。你不能只打印它们的整个数组。 strdup为您分配内存。处理完这些字符串后,必须释放它们。 你的代码使用了魔法数字,这很糟糕。我假设这只是为了让这里更容易阅读; 如果得到的元素超过10个,则会出现缓冲区溢出,因为listData最多只能容纳10个字符串。你至少应该确保我不会在一段时间内超过9。 以下一行:

p_params->listData[i] = *result
获取结果的第一个字符,并将其复制到p_params->listData的第i个字符。因此,只复制每个令牌的第一个字符。您希望如何获取这些标记,作为一个element01element02element03element04element05序列,还是作为一个字符串数组

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

编辑:

如果希望获得字符串数组,可以使用以下命令:将listData声明为

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

p_params->listData[i] = strdup(result);
这将创建字符串的副本,并将其存储在下一个条目中

注:

如果要显示字符串,必须再次循环,并逐个打印。你不能只打印它们的整个数组。 strdup为您分配内存。处理完这些字符串后,必须释放它们。 你的代码使用了魔法数字,这很糟糕。我假设这只是为了让这里更容易阅读; 如果得到的元素超过10个,则会出现缓冲区溢出,因为listData最多只能容纳10个字符串。你至少应该确保我不会在一段时间内超过9。 result是指向字符的指针,该字符可以是字符数组中的元素,而*result是它指向的字符。那么这条线呢

p_参数->列表数据[i]=*结果

正在将字符放入p_参数->列表数据[i]

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

// 5 strings each with 9 characters and a null terminator
char ArrayOfStrings[5][10];
然后,可以使用strcpy或strncpy函数将一个令牌复制到每个字符串中。为了安全起见,我建议您使用strncpy,这样您复制的字符不会超过您的空间,并手动将每个字符串的最后一个元素设置为null。

result是指向一个字符的指针,该字符可以是字符数组中的一个元素,而*result是它所指向的字符。那么这条线呢

p_参数->列表数据[i]=*结果

正在将字符放入p_参数->列表数据[i]

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

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

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

那么这段代码是否满足了您的需要?不,它只会将每个单词的第一个字母保存到数组中?这段代码是否满足了您的需要?不,它只将每个单词的第一个字母保存到数组中。我希望将它们作为字符串数组。如何将字符串标记复制到字符数组中?非常感谢。1.好的,2。以后我会记得解开绳子的。我对Arduino的记忆有限,3。神奇的数字?!?4.我会这样做。@Bildsoe-listData[10],confData[64]@比尔索:神奇数字
这里的数值常量是存储在代码中的10。他们被认为是坏的有很多原因。有关更多信息,请参阅这篇维基百科文章:我希望将它们作为字符串数组。如何将字符串标记复制到字符数组中?非常感谢。1.好的,2。以后我会记得解开绳子的。我对Arduino的记忆有限,3。神奇的数字?!?4.我会这样做。@Bildsoe-listData[10],confData[64]@Bildsoe:幻数是存储在代码中的数字常量。他们被认为是坏的有很多原因。有关更多信息,请参阅这篇维基百科文章: