İlk bakışta, kullanımınız argüman denetiminizle uyuşmuyor. kullanıma göre, birini kullanmanız gerekir: argv[1]
daima dosya adı, başka deyişle
head <filename>
head <filename> -n <count>
, argv[2]
ikiden fazla bağımsız değişken varsa -n
için ayarlanması gerekir biridir. En değiştirmek gerekmez
char *fileName = argv[1];
: Eğer VLAS (değişken uzunluk diziler) kullanmak istemiyorsanız
İkincisi, muhtemelen gibi bir şey ile dosya adı argümanı bir işaretçi kurmalıyım hepsi (muhtemelen fopen
'a aktarırsınız), bu yüzden başka bir kopyasını yapmaya çalışan bir atık. Ayrıca, if
ifademizin or
numaralı hata mesajlaşma, yanı and
olmalıdır. Her ikisi de aynı anda olamayacağı için argc
'un 2 olmayacağı veya 4 olmayacağı garanti edilir.
char fileName[strlen(argv[1])+1];
strcpy(fileName, argv[1]);
veya (eğer dizinin bir kopyasını yapmak için whant yoksa): Ben yazmak daha iyi olduğunu düşünüyorum
#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.
}
'dosyaAdı ', yalnızca onun kapalı bloğu içinde görünür, bu durumda" if "ifadesinin pozitif dalı. – gcbenison
Sadece kullanım mesajını göreceksiniz, çünkü eğer argc '2'ye eşitse, 4'e eşit değildir ve eğer 4'e eşitse, 2'ye eşit değildir ve eğer ikisi de değildir. 2 ya da 4, sonra ... –
GCC komut satırında '-std = c99 'belirttiniz mi? Derleyicinin bir VLA (değişken uzunluklu dizi) kabul etmesini sağlamak için bunu yapmanız gerekir. –