2012-03-14 39 views
3

char **argvとします。どのようにサイズを決定するのですか?ダブルポインタ文字列のサイズは?

私は文字列を持っています。例えば、sleep 30 &argvに保持されています。最後の配列*argvにアクセスしたいと思います。この場合、最後の配列には&が含まれています。どうすればそれにアクセスできますか? strlen(argv)が正しく動作していないようです。 は、**argvがポインタなので、明らかに正しく動作しません。

注:私は**argvをmain()の引数として話しているわけではないので、文字列の長さに関するargcまたはその他のインジケータはありません。

+3

はstrlen(* ARGV)で終わっていることを確信している場合! – vireshas

+0

@vreshasでは、* argvの最後の配列にアクセスすることはできません。ちょうどあなたの長さを示しています。 – darksky

+0

私はすでにそれを試した - 動作しません。 – darksky

答えて

5

EDIT:文字列のカスタム配列で動作するように編集されました。 NULLポインタは配列の終わりを示します。これは4つの文字列の配列を宣言していますが、このメソッドは動的なサイズの配列で使用できます。これがあなたのために機能するために

#include <stdio.h> 

int main() 
{ 
    char* custom[4] = { "sleep", "30", "&", NULL }; 
    int last; 
    for (last = 0; custom[last + 1]; last++); 
    printf("%i - %s\n", last, custom[last]); 
    return 0; 
} 

// ./a.out 
// > 2 - & 

、あなたはそれを構築する際に明示的にchar**に余分NULL文字列を含むように、あなたのプログラムを編集する必要があります。このインジケータがなければ、最後の文字列の後のアドレスは必ずしもNULLであるとは限りません。そのため、カウントにガーベジを含めたり、セグメンテーション違反を引き起こしたりする可能性があります。

+0

私のカスタムメイドcharで動作しません**。あなたはメインから来ています。 – darksky

+0

この方法が適切に機能するためには、配列の終わりに配列が閉じられていることを示す余分なメンバが必要になると思います。私は新しい例を作ります。 – Devourant

+0

カスタムの最後にNULLがない場合はどうなりますか? –

0

argcのようなカウントで渡すのが最も一般的な使い方ですが、あなたはそれがないと言います。

次に、argvの最後の要素が最後の配列要素であることを示すためにNULLを指すようにします。

int argc = 0; 
while (*argv++) { 
argc++; 
} 
0

あなたは引数をトークン化し、あなたが最後のものを持ってまで、それらを介して動作するようにstrtokを使用する必要があります。

Referemce for strtok

+0

本当に何かをトークン化する必要がないときは、それはまったく愚かではないでしょうか? – darksky

+0

@Nayefc他のすべてのトークンを破棄しなければならない場合は、はい。しかし、一般に、すべての議論トークンが何らかの方法で消費されるか、または他の方法で消費される場合があります。 –

0
char *argv[] = {"abc","123","xya"}; 

    //prints the last string 
    printf("%s",a[strlen(*a)-1]); 

//あなたは文字列の配列がNULL

char *temp = 0 ; 
    while(*argv){ 
     temp = *argv; 
     (*argv)++; 
    } 
    //temp has the last string 
+0

これは、「末尾」の「NULL」があることを前提にしています。それは少なくとも文書化されるべきです。 (ポストは、 "main"に引数がないと言っています。) –

+0

私は-Werrorでコンパイルしています。これは* argv ++にそれ以降使用されていないエラーを与えます。 – darksky

+0

(* argv)++はこれを助けますか? – vireshas

関連する問題