我无法使用带指针的stren

问题描述 投票:0回答:1

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

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

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

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

SUB-QUESTION:谁能告诉我从函数返回char指针的方法?我试图这样做,例如“ char * read(FILE * library)”,但在Internet上,他们告诉我不要这样做,所以我很喜欢下面的功能=))。请帮助。

#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;
}
c memory-management memory-leaks
1个回答
0
投票

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

int read (FILE *library)

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

并且函数将返回类型为int的对象,而不是类型为char *的指针。

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

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 *

主要是您两次调用该函数。再次不会释放返回的指针所指向的内存。

length_word = strlen(read(library));printf(“%s%d”,read(library),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;

在函数主体中,您应该编写

char *word = read();

然后

size_t length_word = strlen( word );
printf("%s%zu", word,length_word) ;
free( word );
© www.soinside.com 2019 - 2024. All rights reserved.