2017-02-07 4 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

Welcome to 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に割り当てることは、これらの割り当てが不明瞭に見えても有効です。

番目のステートメント:あなたはarg1char*ポインタを与えているので、

arg1 = (*args)[0]; 

が動作します。 *argsargsの最初の要素へのポインタであり、char**であり、インデックス[0]char*ポインタに位置します。これにより、(*args)[0];のアドレスがarg1に格納されます。これは、あまり普及していない方法でも書くことができます&(*(*args)[0])、これは読みにくく、必要ではありませんが。

さらに、メモリの割り当ては問題ありません。 (*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 *コンパイラはポインタに配列に変換するので効果的に同じものです。したがって、それらの間で変換する必要はありません。ポインタ参照の短縮バージョンとして配列構文の

思うオフセット:引数[0] char**とARG2あるためarg[5] == *(arg + 5)


arg2[0] = args[0];はコンパイルするつもりはない[0]型でありますchar

arg1 = (*args)[0]);はどちらも同じタイプ - char *を使用しているため動作します。