当我在char* pilih(char teks[])函数中使用int main()时,它正在工作。但是当我在新功能中使用此功能时,它表示读取访问冲突。请帮我

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAXARR 1000
char *hilangkan(char[]);
char *pilih(char[]);
char *loadFile(FILE *sumber);

int main(){
    FILE *sumber;
    sumber=fopen("kumpulan.txt","r");
    char *teks=loadFile(sumber);
    char *pilihan=pilih(teks);
    printf("%s",pilihan);
    printf("%s",hilangkan(pilihan));
}

char *hilangkan(char teks[]){
    char *penghilangan;
    strcpy(penghilangan,teks);
    int y=strlen(penghilangan);
    srand(time(NULL));
    int c=48;
    for(int i=0;i<y;i++){
        int hilang=rand()%y+1;
        penghilangan[hilang]='_';
    }
    return penghilangan;
}
char *loadFile(FILE *sumber){
    char *teks;
    if (sumber == NULL) {
        printf("ERROR!!!");
        system("pause");
        return 0;
    }
    char h;
    int count=0;
    while (h = fgetc(sumber) != EOF) {
        teks[count] = h;
        count++;
    }
    fclose(sumber);
    return teks;
}
char *pilih(char teks[]){
    char *hasil;
    srand(time(NULL));
    int w = rand() % 47 + 1;
    char cek[3];
    itoa(w, cek, 10);
    char *c=strstr(teks, cek);
    int lokasi = c - teks + 1;
    int pan = strlen(cek);
    int i;
    if (pan == 2)i = -1;
    else i = 0;
    while (teks[lokasi]!='\n') {
        hasil[i] = teks[lokasi];
        i++;
        lokasi++;
    }
    hasil[i] = NULL;
    return hasil;
}


while(teks[lokasi]!='\n')上显示读取违例访问。 teks0x1110113

最佳答案

强烈建议不要使用链接,您应该希望将整个程序发布在您的问题中。
从您已发布的代码部分和共享的错误信息来看,传递给pilih()函数的参数似乎无效,这反过来又使teks指针指向一些无效的内存。问题的实际原因只能在查看描述问题行为的最小,完整且可验证的程序后才能给出。
pilih()函数中的一个确认问题是您正在从中返回局部变量hasil。局部变量hasil的范围和寿命仅限于pilih()函数,并且一旦pilih()函数退出,它将不再有效。

另外,这句话

hasil[i] = NULL;


是不正确的。变量hasilchar的数组,hasil[i]是索引i处的字符。您正在为其分配NULL这是无效的。我想您想这样做:

hasil[i] = '\0';




编辑:

完整代码已发布在问题中。因此,编辑我的答案并指出OP代码中的问题。

您的代码中有几个问题。如果使用的是gcc编译器,请尝试使用“ -Wall -Wextra”选项编译代码,并检查编译器给出的警告消息。

在函数loadFile()中,查看以下语句:

while (h = fgetc(sumber) != EOF) {


首先,fgetc()函数的返回类型为int而不是char [fgetc()返回类型为int以适应特殊值EOF]。在运算符优先级表中,运算符!==之前,因此不会获得分配给h的读取字符,但是fgetc(sumber) != EOF的结果将分配给h。这应该是

while ((h = fgetc(sumber)) != EOF) {  // check the parenthesis added
       ^                 ^


在此语句中:

teks[count] = h;


您正在访问未初始化的指针。任何未初始化的变量都具有不确定的值,并且指针也是如此。他们可以指向任何随机不确定的地址。没有默认行为。只有行为是不确定的,使用不确定的值会导致未定义行为。

您应该在使用teks之前为其分配内存,如下所示:

teks = malloc(100 * sizeof (char)); //this will allocate memory for 100 characters.
if (teks == NULL)
   exit(EXIT_FAILURE);


看起来您想将整个文件内容存储在teks中。确保为teks分配足够的内存,如果不确定所需的内存大小,则realloc是您的朋友。

同样,在while循环之后,应在存储在teks中的内容的末尾添加终止空字符,如下所示:

teks[count] = '\0';


hilangkan()pilih()函数中存在访问未初始化指针的相同错误。分别检查变量penghilanganhasil

strstr()可以返回NULL指针。您应该添加检查:

char *c=strstr(teks, cek);
if (c == NULL)
   return NULL; // Or whatever the way you want to handle this case
                // but you should not use c


在每个功能中使用该参数值之前,应先进行检查。如果它是指针,请检查它是否为NULL。如果不是NULL,则仅使用它。

另外,完成后,请确保free动态分配的内存。

我不是您到底想做什么,但是我觉得在您的代码中有很多改进的地方。

希望对您有所帮助。

关于c - 读取访问冲突变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53941967/

10-10 07:24