如何将字符串标记保存为字符变量?
我有一个使用udp发送的字符串。现在我想读取字符串,将其标记并将其保存到char数组中。只保存每个单词的第一个字母。所以我只是从元素01到元素05获得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++中,一个字符数组只包含一个字符串,简单地说。为了容纳多个字符串,你需要一个字符数组或者一些分隔符(这是你开始的地方......)。
编辑:
鉴于你想获得一个字符串数组,可以使用以下方法:申报listData
为
char* listData[10];
这意味着listData
现在最多可容纳10串。然后,而不是分配给*result
listData[i]
,使用以下命令:
p_params->listData[i] = strdup(result);
这将创建字符串的副本,并将其存储在一个条目。
注:
- 如果你要显示的字符串,你将不得不再次循环,并通过一个打印出来的。你不能只打印整个数组。
-
strdup
为您分配内存。当你完成这些字符串时,你必须使用free()
这些字符串。 - 您的代码使用幻数,这是不好的。我假设这只是为了更容易在这里阅读;)
- 如果你得到超过10个元素,你会得到一个缓冲区溢出,因为
listData
最多只能容纳10个字符串。你至少应该确保i
在while
左右没有超过9。
result
是一个指向一个字符(其可以是在一个字符数组的元素),而*result
是它指向的字符。太行
p_params->listData[i] = *result;
是把一个字符。
在C字符串中由char类型的数组表示,并且通常以null结尾(即值为0)。这听起来像你需要一个字符串数组,你可以创建一个二维数组。例如:
// 5 strings each with 9 characters and a null terminator
char ArrayOfStrings[5][10];
您可以在一个令牌,然后复制到使用strcpy()
或strncpy()
功能每个字符串。为了安全起见,我建议使用strncpy()
(因此,您不要复制更多字符而不是空间),并手动将每个字符串的最后一个元素设置为空。
那么这段代码是做你需要的吗? –
不,它只保存每个单词的第一个字母到数组 – Bildsoe