0

下面的程序描述:读取 library.txt 中的所有内容,然后将其放入 2 级 char 指针中,从指针中随机选择一个单词,然后使用 strlen 打印该单词中的多个字符。问题是每个字符数增加 2 个单位。例子:

helloworld(10 个字母)-> 12 个字母

abcdef (6 个字母) -> 8 个字母

uiop(4 个字母)-> 6 个字母

子问题:谁能告诉我从函数返回 char 指针的方法?我试图这样做“char *read (FILE *library)”,但在互联网上,他们告诉我不要这样做,所以我确实喜欢下面的函数 =))。请帮忙。

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

int read (FILE *library){

    // count number of word in library.txt
    int n=0;
    char *s=(char *)malloc(256*sizeof(char));
    library=fopen("C:\\Users\\pc\\Desktop\\library.txt","rb");
    while (fgets(s, 256, library)!=NULL)
    {
        n++;
    }
    free(s);

    rewind(library);

    // put all words in library.txt to the level 2 pointer
    char **word=(char**)malloc(n*sizeof(char *));
    for (int i = 0; i < n; i++)
    {
        *(word+i)=(char *)malloc(256*sizeof(char));
        fgets(*(word+i), 256, library);
    }
    fclose(library);

    // choose a rondom word then return it to function
    int j=0;
    srand((int) time(0));
    j=rand()%n;
    return (int)*(word+j);
}

int main(){

    FILE *library;

    int length_word=0;
    length_word=strlen(read(library));
    printf("%s%d",read(library),length_word);

    return 0;
}
4

1 回答 1

0

对于初学者来说,函数声明

int read (FILE *library)

没有意义,因为在函数中参数被覆盖,即它的值未被使用。

而不是类型的指针,char *该函数返回一个 int 类型的对象。

此外,还不清楚为什么要以二进制模式而不是文本模式打开文件。

library=fopen("C:\\Users\\pc\\Desktop\\library.txt","rb");
                                                    ^^^^

其次,这个return语句

return (int)*(word+j);

没有意义并导致内存泄漏,因为除了指针 *( word+j ) 指向的内存之外的所有已分配内存都没有被释放。

因此,在退出函数之前,您必须释放分配的内存。

例如

char *p = *( word + j );
for ( int i = 0; i < n; i++ )
{
    if ( i != j ) free( *( word + i ) );
}

free( word );

return p;

相应地,该函数应具有返回类型char *

在 main 中,您两次调用该函数。并且再次不会释放返回的指针指向的内存。

长度字=strlen(读取(库));printf("%s%d",读取(库),length_word)

还要注意函数 fgets 可以将换行符 '\n' 附加到输入字符串。您需要将其删除。

可以通过以下方式完成

for (int i = 0; i < n; i++)
{
    *(word+i)=(char *)malloc(256*sizeof(char));
    fgets(*(word+i), 256, library);
    word[i][ strcspn( word[i], "\n" ) ] = '\0';
}

如果您使用的旧编译器不会将回车转义字符和新行转义字符转换为一个新行转义字符,那么您可以编写

    word[i][ strcspn( word[i], "\r\n" ) ] = '\0';

因此,该函数应声明为

char * read( void );

在你应该声明的函数中

FILE *library;

在函数 main 你应该写

char *word = read();

接着

size_t length_word = strlen( word );
printf("%s%zu", word,length_word) ;
free( word );
于 2019-10-19T11:51:29.863 回答