J’essaie de recréer les commandes head et tail de linux pour ma classe de programmation. Nous venons tout juste de commencer à utiliser C, donc je suis nouveau à l’idée d’allouer de la mémoire et des pointeurs. Je me demande pourquoi cela ne fonctionne pas.
#include #include int main(int argc,char **argv){ /* Checks if correct amount of arguements */ if(argc != 2 || argc != 4){ printf("Usage: %s head \n Or: head -n ", argv[0]); exit(-1); } if(strcmp(argv[1], "-n" != 0)){ char fileName[strlen(argv[1])] = argv[1]; } } //Comstack error on char fileName[strlen(argv[1])] = argv[1];
Toute idée supplémentaire serait également utile.
Tout d’abord, votre utilisation ne correspond pas à votre vérification des arguments. Selon l’utilisation, vous devez utiliser l’un des:
head head -n
En d’autres termes, argv[1]
est toujours le nom de fichier, argv[2]
est celui qui doit être défini sur -n
s’il y a plus de deux arguments.
Deuxièmement, à moins que vous ne souhaitiez utiliser des VLA (tableaux de longueur variable), vous devez probablement définir un pointeur sur l’argument du nom de fichier avec quelque chose comme:
char *fileName = argv[1];
Vous n’avez pas besoin de le changer du tout (vous passerez simplement à la recherche, probablement), donc c’est un gaspillage d’essayer d’en faire une autre copie.
En outre, votre instruction if
est erronée or
doit être un and
. Il est garanti que argc
ne sera pas 2 ou ne sera pas 4, car il ne peut pas être les deux en même temps.
Je commencerais par quelque chose comme:
#include #include #include static int usage (void) { printf ("Usage: head \n"); printf (" or: head -n \n"); return -1; } int main (int argc,char *argv[]) { char *fileName; int lineCount; // Checks if correct arguments if ((argc != 2) && (argc != 4)) return usage(); if ((argc == 4) && (strcmp(argv[2], "-n" != 0)) return usage(); // Get file spec and line count fileName = argv[1]; lineCount = (argc == 2) ? 10 : atoi (argv[3]); // or strtol for purists if (linecount < 0) lineCount = 0; // Now go ahead and implement the logic for head. }
Je pense qu’il vaut mieux écrire:
char fileName[strlen(argv[1])+1]; strcpy(fileName, argv[1]);
ou (si vous ne voulez pas faire une copie de chaîne):
char* fileName = argv[1];