2017-09-14 2 views
0

Je suis relativement nouveau en C/C++ et j'apprends des arguments de ligne de commande. J'essaie de trier mes arguments de ligne de commande en utilisant strcpy, mais cela me donne une mauvaise sortie. par exemple.Impossible de trier les arguments de ligne de commande à l'aide de strcpy


i/p: je suis


o/p: ami i

Quelqu'un peut-il me aider sur ce que je fais mal ici? Veuillez noter que je ne lance ce programme que pour argc = 3 et que je ne lance ce code que pour les entrées (qui seront triées) comme indiqué dans l'exemple ci-dessus. Je viens de supprimer les boucles pour le débogage.

#include "iostream" 
#include "cstdlib" 
#include "cstring" 
using namespace std; 

int main (int argc, char **argv) 
{ 

    char temp[100]; 

    //sorting my command line arguments 
    if(strcmp(argv[1],argv[2])>0) 
    { 
     strcpy(temp,argv[1]); 
     strcpy(argv[1],argv[2]); 
     strcpy(argv[2],temp); 
    } 

    cout<<argv[1]<<endl; 
    cout<<argv[2]<<endl; 

    return 0; 
} 
+0

Les tailles des arguments de la ligne de commande ne changent pas automatiquement, donc vous ne pouvez pas les copier comme cela (à moins qu'ils n'aient tous la même longueur). – Galik

+0

@CroCo Je compare d'abord les cordes et sur la base de ce que je suis permutation/tri. – siddyi

+0

@Galik alors comment puis-je trier les arguments de longueurs variables? – siddyi

Répondre

1

Considérez votre disposition de la mémoire. Lorsque vous exécutez $ ./a.out i am, il ressemblera à quelque chose comme ça quand le programme démarre:

a . o u t \0 i \0 a m \0 
^     ^ ^
argv[0]   argv[1] argv[2] 

L'écriture à argv[1] dans votre procédure d'échange va changer à ceci:

a . o u t \0 a m \0 m \0 
^     ^ ^
argv[0]   argv[1] argv[2] 

Ensuite, l'écriture à argv[2] sera changer de nouveau à ceci:

a . o u t \0 a m i \0 \0 
^     ^ ^
argv[0]   argv[1] argv[2] 

Ainsi, lorsque vous imprimez argv[1], il lira jusqu'à ce que l'octet nul, vous donnant ami. argv[2] va lire à partir d'un point de départ différent, en vous donnant i. Comme le souligne Galik, c'est parce que argv[1] et argv[2] ne sont pas des tampons à redimensionnement automatique. Ils sont juste des pointeurs dans la mémoire. Je devrais noter à ce point que la disposition exacte n'est pas formellement définie par la langue; vous pourriez obtenir toutes sortes de comportements différents et imprévisibles selon la plate-forme que vous utilisez. Pour résoudre ce problème, vous devez créer un tableau de pointeurs sur les chaînes que vous triez et permuter les pointeurs plutôt que les valeurs des chaînes. Cela sera à la fois plus rapide (nécessitant moins d'octets à copier) et plus sûr (moins de façons de déborder accidentellement les tampons, comme cela arrivera dans votre code actuel si l'une de vos entrées dépasse 100 caractères).

+0

Merci, cela a définitivement éclairci les choses. Edit: Je ne comprends pas pourquoi cette réponse a été downvoted. J'ai accepté votre réponse. – siddyi

+2

Puis-je demander pourquoi cela a été voté? – user3553031