C - 调用函数参数时出错

时间:2016-02-01 19:58:26

标签: c

当我试图调用一个函数时,我到目前为止尝试的参数刚刚导致终端说“函数参数太少”。而且我可以告诉他们想要写什么是从声明它时的参数。我已经阅读了一些关于此的不同文档以及调用参数是什么以及按值或通过引用调用之间的差异,但我仍然无法找出问题。 下面是代码的主要部分,其中包含调用函数以及一些变量。

int main(int argc, char *argv[])
{//main()

char *listwords;

processfile(listwords); //<- this is the line that is causing the problem

WordList mylist;

initialiselist(&mylist);

addword(&mylist, createfillednode(listwords));

printlist(&mylist);
}//main()

下面是processfile()函数:

//process the file
void processfile(WordList *wordList, int argc, char *argv[])
{//process file
    //file pointer
    FILE *f;
    //open the file
    f = fopen(argv[1], "r");
    //check it opened correctly
    if(f == NULL)
    {//if statement
        printf("cannot read file\n");
    }//if statement

    fseek(f, 0, SEEK_END);

    //declare variables
    char *listwords;
    long size = ftell(f);
    char *token;

    //seek beginning of file
    fseek(f, 0, SEEK_SET);
    //set the size of array to the file size
    listwords = (char*)malloc(size+1);
    listwords[size] = '\0';
    //reads the data from the file
    fread(listwords, size, 1, f);

    int i;
    for(i=0; (token = strsep(&listwords, " ")); i++)
    {//for loop replace certain characters with spaces
        if (token != ".")
        {
            //pointer from the token to the dictionary
            wordList->token;
        }else if (wordList->token != "!")
        {

            wordList->token;
        }else if (token != "?")
        {

        wordList->token;
        }else if (token != "\"")
        {

            wordList->token;
        }else if (token != ","){

            wordList->token;
        }else
        {

            wordList->token;
        }
        //increment token to the next word
        token++;
    }//for loop replace certain characters with spaces
    fclose(f);
    return;
}//process file

感谢。

2 个答案:

答案 0 :(得分:1)

你已声明processfile有三个参数。

void processfile(WordList *wordList, int argc, char *argv[])

但你只是给它一个。

processfile(listwords);

这也是错误的类型。它应该是WordList,而是字符串(char *)。

char *listwords;

在C中,你必须为函数提供正确数量的参数和正确的类型(C can do some type casting,但它是严格定义的,通常是关于数字的。)

有一个例外。 Variadic arguments允许您传递未定义数量的参数。这就是像printf这样的函数的工作方式。通常,您应该尽可能地避免可变参数函数,它们会增加复杂性并使类型检查失败。

在您的情况下,processfile只需要两个参数:单词列表和要打开的文件名。永远不会使用argc,并且知道文件名来自argv[1]会对函数产生不必要的限制。

void processfile(WordList *wordList, char *filename)

然后可以用...

调用它
WordList *wordList = ...generate the wordlist somehow...

processfile(wordList, argv[1]);

答案 1 :(得分:1)

processfile()函数根据您的定义采用三个参数:

void processfile(WordList *wordList, int argc, char *argv[])

但是,在main()函数中,您只传递一个参数:

processfile(listwords)

为了使这项工作像您一样,您必须通过所有三个论点;您的listwords,以及参数的计数器和向量:

processfile(listwords, argc, argv)

然而,总的来说,据我所知,从程序上讲,这通常不是一个好主意。一个函数通常应该采用某种特殊的输入并返回一个相关的值,而不是命令行的输入 - 应该在实际被调用的函数之前解析。查看getoptargparse以正确处理参数,确定您 想要传递给processfile()的参数,并仅传递与该参数相关的参数您尝试处理的文件。从读取代码,可能只是文件描述符,应该在一些参数解析纠错后在main()中打开:

void processfile(WordList *wordList, FILE *f)
{
    fseek(f, 0, SEEK_END);

    //declare variables
    char *listwords;
    long size = ftell(f);
    char *token;

    fseek(f, 0, SEEK_SET);
    listwords = (char*)malloc(size+1);
    listwords[size] = '\0';
    fread(listwords, size, 1, f);
    - - - - - - - - - 8< - - - - - - - - - 

这样,您可以在其他地方打开文件,并在任何上下文中调用的任何打开文件上重复使用processfile(),使其成为更强大的功能。