2011-09-05 113 views
1

我有一个使用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); 
} 
+0

那么这段代码是做你需要的吗? –

+0

不,它只保存每个单词的第一个字母到数组 – Bildsoe

回答

3

下面的行:

p_params->listData[i] = *result 

需要的result的第一个字符,并将其复制到的p_params->listDatai个炭。所以只有每个标记的第一个字符被复制。你如何期望获得这些标记,作为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个字符串。你至少应该确保iwhile左右没有超过9。
+0

我希望将它们作为一个字符串数组。 – Bildsoe

+0

我会如何将字符串标记复制到字符数组的数组中? – Bildsoe

+0

非常感谢。 1.好的,2.我会记得随后释放字符串。我在Arduino上的内存有限,3.魔术数字?!?我会这样做的。 – Bildsoe

2

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()(因此,您不要复制更多字符而不是空间),并手动将每个字符串的最后一个元素设置为空。

相关问题