2012-07-16 75 views
0

我是C新手,試圖分割字符數組(我從Ardunio的串行端口接收)。我查了一些教程,並提出了這個。請幫我調試一下。混淆:指針和字符數組在C

char action[10]; 
unsigned long duration; 

void split(char input[20]) 
{ 
char *param, *ptr; 

param = strtok_r(input, "#", &ptr); 
action = *param;      // Need help with this line 

param = strtok_r(NULL, "!", &ptr); 
duration = (unsigned long) *param; // Need help with this line 
} 

據我所知,strtok_r返回一個指向分隔符(#)後面的字符的指針。所以如果我想動作[]是輸入[]的子集字符數組直到分隔符,我該怎麼辦?

編輯: 輸入是這樣的:「left#1000!」

+1

陣列是特殊的,除了聲明不能被 「分配」 用'='運算符。這裏需要指針'char * action'。你需要首先將字符轉換爲數字(在這種情況下使用'strtoul')以獲得'unsigned long'中的持續時間。 – nhahtdh 2012-07-16 13:22:01

+1

你可以發表一個你的源字符串的例子嗎?它是否像'paramparamparamparam#duration.NNN'? – 2012-07-16 13:23:35

+1

如果您的輸入使用'!'作爲終止標記,請將其添加到分隔符列表中:'「#!」' – dasblinkenlight 2012-07-16 13:33:19

回答

1

它看起來像你的第一個標記是一個字符串,第二個標記是一個長的。您可以使用strncpyparam複製到action,然後strtoulunsigned long解析爲duration

param = strtok_r(input, "#!", &ptr); 
strncpy(action, param, sizeof(action)); 
// Force zero termination 
action[sizeof(action)-1] = '\0'; 

param = strtok_r(NULL, "#!", ptr); 
duration = strtoul(param, &param, 10); 
+0

謝謝。這工作。我不明白的是:這裏的參數是一個指針。那麼strncpy如何將它用作參數? – ask 2012-07-16 13:41:53

+2

@ask,因爲數組衰減成指針,並且指針可以指向一塊分配的內存,'strncpy'不會假定它的輸入是數組,但它假定它們是指針。它只是從它指向的位置開始讀取,直到它看到一個NUL(或者寫入到它指向的位置,直到另一個字符串結束爲止)。你應該更多地學習函數,數組和指針,最好從書中學習。 – Shahbaz 2012-07-16 13:48:30

+0

謝謝。我主要使用Java,所以我只對C中的基本概念有基本概念,比如指針。一定會查找它。 – ask 2012-07-16 13:58:19

1

您無法初始化action = *param

您需要使用

memcpy(action, param, strlen(param)) 

duration = (unsigned long) atoi(param) 
1

您應該使用的strcpy()和必要的鑄造,以在C.

指定字符串(或字符數組)

訪問http://en.cppreference.com/w/c/string/byte/strcpy

此功能將關心s之間的membervise分配trings。要手動執行此操作,您必須使用循環並分別指定每個數組成員。

+0

不管情況如何,我建議不要使用'strcpy'。 – nhahtdh 2012-07-16 13:42:17

+0

新的C ...我認爲strcpy現在可以。 – antonio 2012-07-16 13:49:37

1

這段代碼應該用純C(註釋添加)。您可以使用C struct來收集值。 Struct可能會從簡單數據類型的功能返回(如圖所示)。你可以用它作爲自己程序的開始。

編輯:這種方案不需要strXYZ(..)功能(有用的,如果你可能有'\0' -bytes在你輸入的數據)。

... 

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

typedef struct { 
    char action[10]; unsigned long duration; 
} Result; 


Result split(char *input, char delim) 
{ 
Result result = {'\0', 0};     // initialize result by zeros 
char *p = (char*)memchr(input, delim, sizeof(result.action)-1); 
if(p != NULL) {        // if delimiter found in input 
    memcpy(result.action, input, p-input); // copy text till delimiter 
    result.duration = strtoul(p+1, NULL, 10); // convert number after delimiter 
} 
return result;        // return values 
} 

int main(char argc, const char*argv[]) 
{ 
char input[20] = "left#1000!"; 

Result result = split(input, '#'); 
printf("action: %s, duration %u\n", result.action, result.duration); 

return 0; 
} 

... 

問候

RBO

+0

感謝您的詳細解釋! – ask 2012-07-16 13:55:44