web-dev-qa-db-ja.com

Cでargv []の長さを見つける方法

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

int main(int argc, char *argv[]){
    int fir; //badly named loop variable
    char *input[] = calloc( strlen(argv), sizeof(char)); //initializing an array
    for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
        strcat(input, argv[fir]); // appending to input
    }
}
_

私が取得しているエラーは7行目です。「互換性のないポインター型から 'strlen'の引数1を渡している」ということです。 strcat関数でも同じエラーが発生します。また、両方の関数に対して「_char **_が与えられましたが、_const char *_が必要でした」とも述べています。

新しい配列に、最初の要素を除くargvのすべての要素を設定しようとしています。 _argv = &argv[1]_を試しましたが、うまくいきませんでした。

strlen()およびstrcat()関数はchar配列を取りませんか?

14
user1787351
int main(int argc, char *argv[])

argvは、charへのポインターの配列(つまり、文字列の配列)です。この配列の長さは、argc引数に格納されます。

strlenは、nullで終了する必要がある単一の文字列の長さを取得するために使用されます。そうでない場合、動作は未定義です。

30
LihO

Charへのポインタの配列内の特定のエントリを参照するようにstrlenを変更することを誰も提案していないのはなぜかわかりませんか?

 strlen(argv[0])     // also, 1, 2, up to (argc - 1)

また、 http://www.cdecl.org/ は、char *argv[]ステートメント:declare argv as array of pointer to char

4
JackCColeman
int count = 0; 
while(argv[++count] != NULL);

これで、countの長さはargvになります

1
Kidambi Manoj

argvはcharの配列で、strlenは文字列のみを取ります。 argvの各引数の長さを取得したい場合(これは私がやろうとしていたことです)、argv[i][j]のような要素にアクセスして繰り返し処理する必要があります。引数argv[i][j] != '\0'を使用します。引数の数だけが必要な場合は、argcを使用します。

1
user1787351

おそらく、あなたはこのようなことをするつもりでした:

size_t argv_length(char** argv)
{
    size_t ret = 0;
    while( *(++argv) )
        ret += strlen(*argv);

    return ret;
}

0
I Have Fish

argvchar*の配列です。この配列のサイズはargcです。この配列の要素をstrlenに渡す必要があります。

0