web-dev-qa-db-fra.com

Comment trouver la longueur de argv [] en C

#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
    }
}

L'erreur que je reçois concerne la ligne 7. Elle indique "passer l'argument 1 de 'strlen' à partir d'un type de pointeur incompatible". J'obtiens la même erreur pour la fonction strcat . Elle indique également "étant donné un char ** mais attendu un const char *" pour les deux fonctions.

J'essaie de remplir un nouveau tableau avec tous les éléments de argv sauf le premier. J'ai essayé argv = &argv[1] et cela n'a pas fonctionné.

Les fonctions strlen() et strcat() ne prennent-elles pas les tableaux char?

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

argv est un tableau de pointeurs sur char (c'est-à-dire un tableau de chaînes). La longueur de ce tableau est stockée dans l'argument argc.

strlen est destiné à être utilisé pour récupérer la longueur de la chaîne unique qui doit être terminée par la valeur NULL, sinon le comportement est indéfini.

27
LihO

Vous ne savez pas pourquoi personne n'a suggéré de changer strlen pour faire référence à une entrée spécifique dans le tableau de pointeurs sur char?

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

De plus, http://www.cdecl.org/ aide à confirmer que l'instruction char *argv[] est: declare argv as array of pointer to char

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

Maintenant, compter aura la longueur de argv

1
Kidambi Manoj

argv est un tableau de caractères, strlen ne prend que des chaînes. Si vous voulez obtenir la longueur de chaque argument dans argv (c'est ce que j'essayais de faire), vous devez l'itérer, en accédant aux éléments tels que so argv[i][j]. En utilisant l'argument argv[i][j] != '\0'. Si vous voulez juste le nombre d'arguments, utilisez argc.

1
user1787351

Peut-être que vous vouliez faire quelque chose comme ça:

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

    return ret;
}

?

0
I Have Fish

argv est un tableau de char*. La taille de ce tableau est argc. Vous devriez passer un élément de ce tableau à strlen.

0