2013-04-10 6 views
2
#include<stdio.h> 
#include<string.h> 
int main(int argc,char *argv[]) 
{ 
    char string[]="#"; 
    printf("%s\n",argv[1]); 
    printf("%s\n",argv[2]); 
    printf("%s\n",argv[3]); 
    strcat(argv[1],string); 
    printf("argv[1] is %s\n",argv[1]); 
    printf("argv[2] is %s\n",argv[2]); 
    printf("argv[3] is %s\n",argv[3]); 
    return 0; 
} 

quand j'utilise strcat() pour ajouter quelque chose à la fin de la argv [1], argv [2] sera perdue (strlen (argv [ 2]) passe à 0 après utilisation strcat) .But argv [3] n'a pas de changement .Pourquoi ???Problèmes d'utilisation principale (int argc, char * argv [])

+0

Qu'est-ce que ce code fait oO » – Thomas

+0

peut-être un double de http://stackoverflow.com/questions/963493/is-it-possible-to-change-argv-or-do-i- besoin à créer-an-copie rajustée du-it – Arun

+0

@Thomas Ce code est juste pour résoudre ma question avec argv []. il ne peut rien faire de sens. – dsfa24

Répondre

2

Vous ne pouvez pas ajouter des éléments directement à argv[] car chaque argv[] est affecté en série et à un espace en mémoire pouvant uniquement contenir sa taille d'origine.

Pour comprendre ce qui se passe, imaginez argv est quelque chose comme ceci:

char buffer[] = "./program\0one\0two\0three\0"; 
char *argv[4] = { &buffer[0], &buffer[10], &buffer[14], &buffer[18] }; 

Comme vous pouvez le voir, si vous écrivez quelque chose après "one" vous écraserez "two" et briser tout cela parce qu'ils sont sérialisés dans Mémoire.

Pour contourner ce problème, vous devez copier chaque argv[] à un tampon plus grand où vous pouvez sans risque apporter les modifications. Par exemple:

char buf[1024]; 
strcpy(buf, argv[1]); 
strcat(buf, string); 
printf("argv[1] is %s\n", buf); 
+0

Merci pour votre aide! – dsfa24

0

Vous n'êtes pas censé modifier argv [] = les effets ne sont pas définis

+0

Je le pense aussi, mais y a-t-il une référence? – Arun

+0

En fait, vous pouvez modifier 'argv [quelquechose]' (le pointeur). Modifier ce à quoi pointe le pointeur n'est pas si kasher. – paxdiablo

+0

@paxdiablo: Alors, est-ce comme 'char const * argv []'? – Arun

2

Rappelez-vous que « chaînes » en C sont nuls tableaux terminés de caractères. Supposons que les quatre arguments d'origine étaient "un", "deux", "trois" et "quatre"; alors ces quatre arguments sont stockés dans la mémoire comme

one\0two\0three\0four\0 

lorsque vous joint en annexe # après la argv (strcat ajoutera un \ 0 également) [1], le contenu de la mémoire devient:

one\0two#\0hree\0four\0 

vous pouvez Vérifiez maintenant que argv [2] pointe vers le caractère \ 0, donc c'est une chaîne vide. argv [3] pointe toujours correctement, et il reste intact.

Questions connexes