2017-02-07 284 views
0

我正在嘗試做一個解析器。我有一個使用指針的版本,但我想知道如何將它從指針(char * p)轉換爲c字符串(char p []),以便更熟悉它們的工作方式。解析C字符串和多個指針C字符串

我有一個函數...

int makearg(char s[], char**args[]) 
{ 
    char *arg1 
    char arg2[50]; 

    //I'm aware these don't assign the args pointer value to arg2. 
    arg2[0] = args[0]; 

    //And I'm aware this does. 
    arg1 = (*args)[0]); 
} 

我的問題是什麼是等價的。或者可能是對發生了什麼的簡短解釋。其他解決方案只是給出工作代碼而沒有真正說明它的工作原理

我不認爲這是通過我的mem分配是使用指針和[]。這工作正常。如果有人有時間,也不確定如何工作。

(*args)[i] = (char*) malloc(sizeof(char) * tokenLen); 
+0

http://www.cs.bu.edu/teaching/c/string/intro/ – CabDude

+1

歡迎來到StackOverflow!你問的是哪個編譯器錯誤?你從這些錯誤中得到了什麼詞,特別是你有沒有困惑?當你在這裏發佈示例時,你需要確定他們只會產生你所問的問題,而沒有其他問題。您可以通過生成[MCVE](http://stackoverflow.com/help/mcve)來完成此操作。 – Sebivor

+0

從char *到char **的無效轉換或我嘗試的任何組合。我知道類型是不同的,但我不知道如何。每次我編譯它會給我一個錯誤,然後我會調整以使錯誤消失,但指針會錯誤。所以我想我現在明白了。非常感謝。 – cba1067950

回答

1

第一條語句:

arg2[0] = args[0]; 

arg2[0]char型和args[0]char**類型。這個任務不能工作,因爲他們是不同的類型。

然而,像這樣的工作:

arg2[0] = (**args)[0]; /* or even (*args)[0][0] */ 

,因爲你給arg2[0]一個char,因爲它們是匹配的類型是正確的。 **args是指向指向args的第一個元素的指針,它是char*,並且要達到char,則需要索引[0]。他們有多種方式可以做到這一點。將arg2[0]分配給args[0][0][0]或甚至***args是有效的,儘管這些分配看起來很模糊。

第二條語句:

arg1 = (*args)[0]; 

會工作,因爲你給arg1,一個char*指針。 *args是指向args的第一個元素的指針,它是char**,並且索引[0]定位到char*指針。這將(*args)[0];的地址存儲在arg1之內。這甚至可以用不太流行的方式編寫,儘管這很難閱讀,也不是必需的。

此外,你的內存分配是好的。 (*args)[i]是指向args的第一個元素的指針,它是char**,而[i]將引用char*指針。您需要事先分配char**,因爲這也是一個未初始化的指針指針。

您也可以縮短:

(*args)[i] = (char*) malloc(sizeof(char) * tokenLen); 

到:

(*args)[i] = malloc(tokenLen); 

正如你don't need to cast return of malloc(),並且sizeof(char)總是1。 '

+0

你是一個聖人。謝謝你的天堂般的精神。 <3 – cba1067950

+0

@ cba1067950沒問題:)我很高興能幫上忙。 – RoadRunner

0

char[]char *實際上是同樣的事情,因爲編譯器轉換陣列指針。所以不需要在它們之間進行轉換。

認爲數組語法作爲指針引用的具有縮短的版本的偏移:arg[5] == *(arg + 5)


arg2[0] = args[0];不會編譯,因爲ARGS [0]是char**和ARG2 [0]的類型爲char

arg1 = (*args)[0]);的作品,因爲你們都有相同的類型 - char *