2011-09-05 116 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()(因此,您不要複製更多字符而不是空間),並手動將每個字符串的最後一個元素設置爲空。

相關問題