5

我正在尝试为我的编程课从 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];

任何额外的见解也会有所帮助。

4

2 回答 2

3

我认为最好写:

char fileName[strlen(argv[1])+1];
strcpy(fileName, argv[1]);

或(如果您不想复制字符串):

char* fileName = argv[1];
于 2012-09-11T01:37:42.977 回答
2

首先,您的用法与您的参数检查不匹配。根据使用情况,您必须使用以下之一:

head <filename>
head <filename> -n <count>

换句话说,argv[1]始终文件名,如果有两个以上的参数,则argv[2]需要设置为文件名。-n

其次,除非您想使用 VLA(可变长度数组),否则您可能应该只设置一个指向文件名参数的指针,如下所示:

char *fileName = argv[1];

你根本不需要改变它(你只是将它传递给fopen,大概),所以尝试制作另一个副本是一种浪费。

另外,你的if说法是错误的or,应该是and。保证argc不会是 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.

}
于 2012-09-11T01:32:39.140 回答