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

标签 c char arduino strtok

我有一个使用 udp 发送的字符串。现在我想读取字符串,将其标记化并将其保存到 char 数组中。仅保存每个单词的第一个字母。所以我只得到从 element01 到 element05 的 5 个 e。我在 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 );
}

最佳答案

下面一行:

p_params->listData[i] = *result

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

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

编辑:

如果你想得到一个字符串数组,你可以使用下面的方法: declare listData as

char* listData[10];

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

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

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

注意:

  1. 如果要显示字符串,则必须再次循环,然后将它们一一打印出来。你不能只打印它们的整个数组。
  2. strdup 为您分配内存。处理完这些字符串后,您必须 free()
  3. 您的代码使用了魔数(Magic Number),这很糟糕。我假设这只是为了让这里更容易阅读;)
  4. 如果获取的元素超过 10 个,就会出现缓冲区溢出,因为 listData 最多只能容纳 10 个字符串。您至少应确保 iwhile 左右的时间内不会超过 9。

关于c - 如何将字符串标记保存到 char 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308045/

相关文章:

c - 如何为 Arduino Due 实现tone() 和 noTone()?

c++ - 如何用空格 cin 整个句子

c - 在 C 中存储变量

c++ - 在PC平台上使用Arduino C++库

c - 如何将 Arduino 读数写入计算机上的文件?

c - printf() 打印整个字符矩阵

c - 如何在Socket编程中手动输入IP地址以及如何打印痕迹?

c++ - C 或 C++ 中的亚毫秒精度计时

c - SEEK_HOLE 始终指向文件末尾

c++ - 棘手的算术或手法?