读取访问冲突变量

时间:2018-12-27 08:30:08

标签: c visual-studio visual-c++

当我在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

1 个答案:

答案 0 :(得分:0)

强烈建议不要使用链接,您应该将整个程序发布在您的问题中。
从您已发布的代码部分和共享的错误信息来看,传递给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的结果将分配给{ {1}}。这应该是

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()penghilangan

hasil可以返回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动态分配的内存。

我不是您真正想做的,但是我觉得在您的代码中有很多改进的地方。

希望获得帮助。