我正在尝试从linux中为我的编程类重新创建head和tail命令.我们刚开始使用C,所以我对分配内存和指针的想法不熟悉.我想知道为什么这不起作用.
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv){
/* Checks if correct amount of arguements */
if(argc != 2 || argc != 4){
printf("Usage: %s head <file> \n Or: head <file> -n <number of characters>", argv[0]);
exit(-1);
}
if(strcmp(argv[1], "-n" != 0)){
char fileName[strlen(argv[1])] = argv[1];
}
}
//Compile error on char fileName[strlen(argv[1])] = argv[1];
Run Code Online (Sandbox Code Playgroud)
任何其他见解也会有所帮助.
首先,您的用法与您的参数检查不匹配。根据用途,您必须使用以下之一:
head <filename>
head <filename> -n <count>
Run Code Online (Sandbox Code Playgroud)
换句话说,始终argv[1]是文件名,如果有两个以上参数,则需要设置该文件名。argv[2]-n
其次,除非您想使用 VLA(可变长度数组),否则您应该只设置一个指向文件名参数的指针,如下所示:
char *fileName = argv[1];
Run Code Online (Sandbox Code Playgroud)
您根本不需要更改它(fopen大概您只需将其传递给 ),因此尝试制作另一个副本是一种浪费。
另外,你的if说法是错误的or,应该是and。保证argc既不是 2 也不是 4,因为它不能同时是 2 或 4。
我会从以下内容开始:
#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.
}
Run Code Online (Sandbox Code Playgroud)