C Commande de base de base

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];