2013-09-06 17 views
10
#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'errore che sto ottenendo è per la riga 6. si dice "passare l'argomento 1 di 'strlen' dal tipo di puntatore incompatibile. Ottengo lo stesso errore per Funzione strcat Dice anche un char ** ma si aspetta un const char * per entrambe le funzioni Sto cercando di popolare un nuovo array con tutti gli elementi di argv tranne il primo.Ho provato argv = & argv [1] e non ha funzionato. fa i strlen() e strcat() funzioni non prendono array char?Come trovare la lunghezza di argv [] in C

+0

Penso che si desidera un indice in quella 'argv []', ma non andare fuori '[0 .. (argc-1]' quando lo fai. – WhozCraig

risposta

19
int main(int argc, char *argv[]) 

argv è un array di puntatori a char (cioè array di stringhe). La lunghezza di questo array è archiviata nell'argomento argc.

strlen è pensato per essere utilizzato per recuperare la lunghezza della singola stringa che deve essere terminata con null, altrimenti il ​​comportamento non è definito.

+1

Penso di aver capito. Non posso usare argv [] perché non è in realtà un array di caratteri, una serie di puntatori a char? se faccio una copia di argv [x] e lo uso in strcat come strcat (input, copyargv [x]) funzionerà? – user1787351

+0

argv [] è una matrice di stringhe (cioè una matrice di puntatori a puntatori di caratteri, dove ogni puntatore char punta all'inizio di una stringa): argc indica quanti stringhe che hai; strlen restituisce la lunghezza della stringa passata, quindi può onl y essere chiamato su un char *, cioè char [], cioè string): strlen (argv [i]), dove i è tra 0 e argc. – VeraKozya

0

argv è un array di char*. La dimensione di questo array è argc. si dovrebbe passare un elemento di questo array a strlen.

0

Forse volevi dire fare qualcosa di simile a questa:

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

    return ret; 
} 

?

0

argv accetta un arryas di char * ma è necessario passare argc a strlen piuttosto che a tutto l'array. Quindi non si ottiene alcun errore su strcat.

#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(argc), 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 
} 
4

Non certo perché nessuno ha suggerito cambiando strlen per fare riferimento a una voce specifica nella matrice di puntatori a char?

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

Inoltre, http://www.cdecl.org/ aiuta a confermare che la dichiarazione è char *argv[]: declare argv as array of pointer to char

0

argv è un array di char, strlen richiede solo stringhe. Se vuoi ottenere la lunghezza di ogni argomento in argv (che è quello che stavo cercando di fare), devi scorrere attraverso di esso, accedendo agli elementi in questo modo argv[i][j]. Utilizzando l'argomento argv[i][j] != '\0'. Se vuoi solo il numero di argomenti usa argc.

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

Ora, conteggio avrà la durata di argv

Problemi correlati