2011-12-28 1 views
0

J'ai ce code fonctionnant finalement avec un seul argument sur ma ligne de commande, c'est-à-dire un fichier avec lequel travailler, bien que j'ai conçu le code avec le concept de travailler avec un nombre illimité de fichiers. Ce qu'il fait est de prendre un certain nombre X de fichiers txt contenant des mots séparés par des espaces, et remplace les espaces par \ n créant ainsi une liste de mots. Bien, il termine avec succès le premier argument, il segmente des fautes quand j'ajoute deux, ou trois, veut vraiment que cela fonctionne!Deux arguments de ligne de commande ou plus?

PS. Ceci est une continuation de 2 autres articles sur le même code. Ce n'est pas une tâche de devoirs, je suis actuellement loin de Uni, et j'expérimente juste avec le fichier C i/o avant nos conférences.

#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
FILE *fpIn, *fpOut; 
int i, j; 
j = 1; 
int c; 
char myString[256]; 

printf("%d", argc); 
printf("\n"); 
printf("The following arguments were passed to main(): "); 
      for(i=1; i<argc; i++) printf("%s ", argv[i]); 
printf("\n"); 

while(argc--) { 
    for(i = 1; i <= argc; i++) { 
     fpIn = fopen(argv[j], "rb"); 
     snprintf(myString, 256, "%s~[%d]", argv[j], i); 
     fpOut= fopen(myString, "wb"); 
     while (1) { 
      c = fgetc(fpIn); 
      if (c == EOF) 
       break; 
      if (isspace(c)) 
       c = '\n'; 
      fputc(c, fpOut); 
     } 
     j++; 
    } 
} 
return 0; 
} 
+0

Vous arriverez à la solution une fois que vous aurez obtenu la droite imbriquée. Éliminer complètement le 'while' et * utiliser * l'index itéré dans la boucle' for'. – thiton

+0

Pourquoi avez-vous à la fois 'while (argc -)' et 'for (i = 1; i <= argc; i ++)'? – Francois

Répondre

2

On dirait que vous avez deux boucles qui font la même chose!

while(argc--) { 
for(i = 1; i <= argc; i++) { 

Vous avez vraiment besoin d'une seule boucle pour parcourir les arguments. Si vous utilisez la boucle while, utilisez argc ou j comme index pour argv. Si vous utilisez la boucle for, qui est la plus propre, utilisez l'argument de boucle for i comme index de argv.

+0

Merci, vous venez de le rendre incroyablement évident! – PnP

2
for(i = 1; i <= argc; i++) 

devrait être

for(i = 1; i < argc; i++) 

Oui, je sais que vous êtes à partir de 1, mais c'est parce que argv[0] est censé être le nom des programmes d'invocation.