2011-02-01 12 views
1

私のプログラムはargcとargv []でコマンドライン引数を取得します。私の質問は、argv [1] [i]の長さを見つける方法です。Cプログラミングの長さ2を見つけます次元配列

ARGVの長さをつかむ私のコード[]

int my_strlen(char input[]){ 
    int len = 0; 
    while(input[len] != '\0'){ 
     ++len; 
    } 
    return len; 
} 

が、私はARGVを見つけるしようとすると、[1] [LEN]私は、添字値が配列でもポインタでもない取得: 私の試み

int my_strlen(char input[]){ 
    int len = 0; 
    while((input[1][len] - '0') != '\0'){ 
     ++len; 
    } 
    return len; 
} 

FULL CODE:事前に任意の助け

#include <stdio.h> 
#include <math.h> 

int my_strlen(char input[]); 

int main(int argc, char *argv[]){ 
int length = 0; 
length = my_strlen(argv[1]); 
long numberArr[length]; 
int i, j; 

for(i = 0; i < length; i++){ 
    numberArr[i] = argv[1][i] - '0'; 
} 

return 0; 
} 

int my_strlen(char input[]){ 
int len = 0; 
while((input[1][len] - '0') != '\0'){ 
    ++len; 
} 
return len; 
} 

ありがとう!

+1

argvは2次元の文字配列( 'char')です。つまり、文字列の1次元配列です。 – Gabe

+0

@Gabe:ありがとう、私はCの学習の初期段階にあるので、Cで文字列型がないので、人が文字列として参照するときにちょっと混乱しました。しかし、助けてくれてありがとう! – Grant

答えて

3

あなたはargvの内容について混乱していると思います。 OSは...引数ALA ...

my_program first second third 

でmy_programを起動すると、...

int argc = 4; 
const char* argv[4] = { "my_program", "first", "second", "third" }; 

あなたのプログラムで次の宣言を有することに似ているように、ASCIIZ文字列の数を渡しますしたがって、argv[1][i]にインデックスを付けると、文字列のi番目の文字が「最初」になります。これは、0(「f」を生成する)と5(終了NUL文字 '\ 0'を指す)の間のiの値に対してのみ有効です。

したがって、2次元のN * M配列はありませんが、ポインタの配列(charの配列)があります。 のように、通常のstrlen()関数を呼び出して、各引数の文字数を調べることができます。 argcだけがargvの要素の総数を示します。

これは役に立ちますか?

+0

さて、私は理解していると思うので、文字列の長さを得るためにargv [1]を文字列として扱い、strlen(argv [1])を使うべきですか?私は以前これを使用していて、セグメンテーションフォールトエラーが発生することがありました。 – Grant

+0

@Grant:はい、これは正しいアプローチです。 argv [1]を使う前にargcをチェックしましたか?コマンドライン引数を提供するのを忘れた場合、strlen(argv [1])は使用できません。いくつかの環境変数が設定されていないシェルでは、かなり簡単です。プログラム名は 'argv [0]'で 'argc'が' 1'であることを忘れないでください。最後の引数は ' argv [argc-1] '。別の言い方をすれば、 'argv> 1 'をチェックして' argv [1] 'があることを確認してください。それでも問題が解決しない場合は、壊れたコードを投稿してください。 –

+1

明確にするために、2次元の文字配列と文字列(文字ポインタ)の配列には違いがあります。 argv [0] = 0x123456の場合を考えてみましょう。 argv [1]は0x055555になる可能性があります。 argvは文字の行列と同じではありません... – Splat

1

mainには、argv[1]my_strlenに渡しています。つまり、my_strlenは、通常の1次元文字列を受信するだけです。 input[1][len]を実行する必要はありません。ちょうどinput[len]です。

+0

私は以前それを持っていました。しかし、ときどきセグメンテーションフォールトが発生することがあります。これは少し違っています。 – Grant

+0

固定されていても、 'input [len] - '0'!= '\ 0''の間に' my_strlen() 'ループが発生します。文字 '0'(ASCII、48桁)を符号化するために使用された数値を減算し、結果が文字 '\ 0'を符号化するために使用された数値でないことを確認することを効果的に示しています(常に0)。 "x - y!= 0"が "x!= y"と等しいとすれば、ゼロ/ '0'文字が見つかるまでループしているだけです。しかし、あなたはCの解釈を利用する 'while(input [len]!= '\ 0')'や同等の 'while(input [len])'を使うだけでASCII NUL/'\ 0' 0は偽、0以外は真です。 –

+0

@Grant:もう一度見て、別の問題があります。文字列の終わりは値 '\ 0'の文字で通知されるので、whileループは 'while(input [len]!= '\ 0')'のようになります。 –

関連する問題