我有一个使用 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);
这将创建字符串的副本,并将其存储在下一个条目中。
注意:
- 如果要显示字符串,则必须再次循环,然后将它们一一打印出来。你不能只打印它们的整个数组。
strdup
为您分配内存。处理完这些字符串后,您必须free()
。- 您的代码使用了魔数(Magic Number),这很糟糕。我假设这只是为了让这里更容易阅读;)
- 如果获取的元素超过 10 个,就会出现缓冲区溢出,因为
listData
最多只能容纳 10 个字符串。您至少应确保i
在while
左右的时间内不会超过 9。
关于c - 如何将字符串标记保存到 char 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308045/