_#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
配列を取りませんか?
int main(int argc, char *argv[])
argv
は、char
へのポインターの配列(つまり、文字列の配列)です。この配列の長さは、argc
引数に格納されます。
strlen
は、nullで終了する必要がある単一の文字列の長さを取得するために使用されます。そうでない場合、動作は未定義です。
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
int count = 0;
while(argv[++count] != NULL);
これで、countの長さはargvになります
argv
はcharの配列で、strlen
は文字列のみを取ります。 argv
の各引数の長さを取得したい場合(これは私がやろうとしていたことです)、argv[i][j]
のような要素にアクセスして繰り返し処理する必要があります。引数argv[i][j] != '\0'
を使用します。引数の数だけが必要な場合は、argc
を使用します。
おそらく、あなたはこのようなことをするつもりでした:
size_t argv_length(char** argv)
{
size_t ret = 0;
while( *(++argv) )
ret += strlen(*argv);
return ret;
}
?
argv
はchar*
の配列です。この配列のサイズはargc
です。この配列の要素をstrlen
に渡す必要があります。