我对一个函数有两个问题,一个非常妨碍,另一个不太妨碍。
我正在学习C,下面的(为了便于阅读而减少)m a in和findWord函数应该将随机选择的单词从.txt文件存储到“wordToGuess”中。
findWord将单词存储到指针“wordToGuess”中很好,但我似乎无法从函数中提取出来在主函数中使用它。我尝试将函数设为“void”,并在函数中直接修改“wordToGuess”,并将其设为char*返回单词供main使用,但没有成功。在这两种情况下,int*wordLength都没有问题,这使我认为这个问题可能源于对指针或内存分配的潜在误解。
另一个不太重要的问题是free(wordToFind)以某种方式破坏了整个过程,但我对这个问题没有那么在意。
谢谢你的帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

#define MIN 0
#define MAX 10
#define WORDSIZE 40

char* findWord(char *wordToGuess , int *wordLength);


int main(int argc , char *argv[])
{
    int *wordLength = NULL , lengthWord = 0;
    char *wordToGuess = NULL ;

    srand(time(NULL));                                              // For rand() in findWord

    wordLength = &lengthWord;

    printf("\n1: %s\n" , findWord(wordToGuess , wordLength);        // Sole purpose of this tester printf is to verify findWord function

    return 0;
}


char* findWord(char *wordToGuess , int *wordLength)
{
    int wordNumber = 0 , i = 0;
    char word[WORDSIZE] = {0};

    FILE *wordFile = NULL;

    wordFile = fopen("words.txt" , "r");

    if(wordFile != NULL)
    {
        wordNumber = (rand() % (MAX - MIN + 1)) + MIN;                  // Random number to choose word form words.txt

        for(i = 0 ; i < wordNumber ; i++)
        {
            while(fgetc(wordFile) != '\n');                             // Move the cursor to line 'wordNumber'
        }

        fgets(word , WORDSIZE , wordFile);                              // Get word from that line
    }

    *wordLength = strlen(word);

    wordToGuess = malloc(*wordLength * sizeof(char));
    if(wordToGuess == NULL)
        exit(0);

    wordToGuess = word;

    fclose(wordFile);

   // free(wordToGuess);

    return wordToGuess;

}

最佳答案

你的代码有很多问题。首先也是最重要的是C按值传递参数,这意味着当您将参数传递给函数时,它们会被复制。所以在一个函数中,你所拥有的只是一个副本,修改一个副本当然不会修改原始的。
C没有按引用传递,但可以使用指针来模拟它。在您的情况下,必须将指针传递给指针。这可以使用operator&的地址来完成。当然,必须修改函数才能将指向指针的指针作为其第一个参数。
在某种程度上,您现在使用wordLength参数来执行它,但是您声明它是调用函数中的指针,并且是指向NULL的指针,这意味着在函数中取消对它的引用将导致undefined behavior
所以正确的代码应该是

char* findWord(char **wordToGuess , int *wordLength);

int main()
{
    int wordLength = 0;
    char *wordToGuess = NULL;

    printf("%s\n", findWord(&wordToGuess, &wordLength));
    // Note use of address-of operator
}

然后在findWord函数中,您当然必须取消对字符串指针的引用,例如。
*wordToGuess = malloc(...);

findWord函数中还有其他错误,比如您重新分配指针,而不是复制到它,这将使您失去原来分配的指针,使它指向一个局部变量,并且在函数返回时无效。而是复制到内存中。
findWord函数中的另一个主要问题是将一个字节分配给小字节。请记住,字符串比strlen报告的多包含一个字符,即字符串结束符'\0'。分配内存时,必须为此字符添加空间。

07-28 03:03
查看更多