Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我无法将stren与指针一起使用_C_Memory Management_Memory Leaks - Fatal编程技术网

C 我无法将stren与指针一起使用

C 我无法将stren与指针一起使用,c,memory-management,memory-leaks,C,Memory Management,Memory Leaks,下面的程序描述:读取library.txt中的所有内容,然后将其放入2级字符指针中,从指针中选择一个单词,然后使用strlen打印该单词中的多个字符。问题是每增加2个单位的字符数。示例: helloworld(10个字母)->12个字母 abcdef(6个字母)->8个字母 uiop(4个字母)->6个字母 子问题:有人能告诉我从函数返回字符指针的方法吗?我试着这样做“char*read(FILE*library)”,但在互联网上,他们告诉我不要这样做,所以我喜欢下面的函数=))。请帮忙 #in

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

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

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

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

子问题:有人能告诉我从函数返回字符指针的方法吗?我试着这样做“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;
}
#包括
#包括
#包括
整型读取(文件*库){
//计算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++;
}
免费的;
倒带(库);
//将library.txt中的所有单词放在2级指针上
字符**字=(字符**)malloc(n*sizeof(字符*);
对于(int i=0;i
首先,函数声明

int read (FILE *library)
没有意义,因为在函数中参数被覆盖,即其值未被使用

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

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

library=fopen("C:\\Users\\pc\\Desktop\\library.txt","rb");
                                                    ^^^^
第二,这个返回语句

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;
如果使用的旧编译器未将回车转义字符和新行转义字符转换为一个新行转义字符,则可以编写

    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 );

由于您从分配的数组中返回一个随机元素,因此很可能会从每个调用中返回不同的元素。但是,由于每次在获取随机数之前都要调用
srand
,因此发生这种情况的可能性很小。其他注意事项:为什么要将
library
作为参数传递给函数?您有大量的资源泄漏(您在每次调用中调用
malloc
很多次,但您从未
free
内存)。在C里,你。最后,对于任何指针或数组
p
和索引
i
,表达式
*(p+i)
完全等于
p[i]
。后者通常更容易理解。最后一点非常重要:返回指针,但将其强制转换为
int
。在
int
为32位的系统上(过去几十年中几乎所有的系统),如果指针不是32位的(通常是任何64位系统),那么这将导致非常大的问题和未定义的行为。提示:从函数返回指针没有问题。如果返回的指针包含函数返回时停止存在的变量/数组的地址,则会出现问题,因为调用方对该指针所做的任何操作都会产生未定义的行为。那么实际问题的答案(有一个尾随的CRLF)如何@ikegami当读取记录时,编译器应将crlf转换为新行字符。我展示了如何移除它。可能是使用了旧的编译器。哦,你没有提到换行符,但是你没有回答这个问题的事实仍然存在。这可能是一个CRLF,原因是他们可能在unix系统中使用Windows文件(包括Cygwin和MSYS)。链接中的代码已经修复,但仍然无法工作。请help@Becker您确定文件已成功打开吗?打开文件后,在函数内检查库是否等于NULL。
size_t length_word = strlen( word );
printf("%s%zu", word,length_word) ;
free( word );