First things first, your usage doesn't match your argument checking. According to the usage, you must use one of:
head <filename>
head <filename> -n <count>
In other words, argv[1]
is always the filename, argv[2]
is the one that needs to be set to -n
if there are more than two arguments.
Secondly, unless you want to use VLAs (variable length arrays), you should probably just set up a pointer to the filename argument with something like:
char *fileName = argv[1];
You don't need to change it at all (you'll just be passing it to fopen
, presumably), so it's a waste trying to make another copy.
In addition, your if
statement is wrong as an or
, it should be an and
. It's guaranteed that argc
will either not be 2 or not be 4, since it can't be both at the same time.
I would start with something like:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int usage (void) {
printf ("Usage: head <file>\n");
printf (" or: head <file> -n <number of characters>\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.
}