C 读取访问冲突变量

C 读取访问冲突变量,c,visual-studio,visual-c++,C,Visual Studio,Visual C++,当我在int main()函数中使用char*pilih(char-teks[])时,它工作正常。但是当我在新函数中使用这个函数时,它说读访问冲突。请帮帮我 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #define MAXARR 1000 char *hilangkan(char[]); char *pilih(char[]); char

当我在
int main()
函数中使用
char*pilih(char-teks[])
时,它工作正常。但是当我在新函数中使用这个函数时,它说读访问冲突。请帮帮我

#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;
}
#包括
#包括
#包括
#包括
#定义maxarr1000
char*hilangkan(char[]);
char*pilih(char[]);
char*loadFile(FILE*sumber);
int main(){
文件*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=斯特伦(彭希兰甘);
srand(时间(空));
int c=48;

对于(int i=0;i链接,我们非常不鼓励,您的期望是,您应该在问题中发布整个程序。
从您发布的代码部分和共享的错误信息来看,参数似乎传递给了
pilih()
函数无效,从而使
teks
指针指向一些无效内存。只有在查看描述问题行为的最小、完整且可验证的程序后,才能给出问题的实际原因。
pilih()
函数中的一个确认问题是,您正在从它返回一个局部变量
hasil
。局部变量
hasil
的范围和寿命仅限于
pilih()
函数,一旦
pilih()
函数退出,它就不再有效

还有这个声明

hasil[i] = NULL;
不正确。变量
hasil
char
的数组,
hasil[i]
是索引
i
处的一个字符。您给它赋值的
NULL
无效。我想您应该这样做:

hasil[i] = '\0';

编辑:

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

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

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

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

while ((h = fgetc(sumber)) != EOF) {  // check the parenthesis added
       ^                 ^
在本声明中:

while (h = fgetc(sumber) != EOF) {
teks[count] = h;
您正在访问一个未初始化的指针。任何未初始化的变量都有不确定值,指针也是如此。它们可以指向任何随机不确定地址。没有默认行为。只有行为是不确定的,使用不确定值会导致未定义的行为

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

teks = malloc(100 * sizeof (char)); //this will allocate memory for 100 characters.
if (teks == NULL)
   exit(EXIT_FAILURE);
teks[count] = '\0';
看起来您想将整个文件内容存储在
teks
中。请确保为
teks
分配足够的内存,如果您不确定所需的内存大小,则
realloc
是您的朋友

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

teks = malloc(100 * sizeof (char)); //this will allocate memory for 100 characters.
if (teks == NULL)
   exit(EXIT_FAILURE);
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
,则仅使用它

另外,在使用完动态分配的内存后,请确保
释放它

我不知道你到底想做什么,但我觉得在你的代码中有很多改进的余地


希望对您有所帮助。

您是否尝试过使用调试器进行单步调试?传递给
pilih()
函数的参数是什么?您知道
strstr()吗
可以返回
NULL
指针。你能试着格式化一下吗?阅读你的代码真的很难。@Tobi是的,但上面写着same@H.S.sorry我不知道你是什么意思,我还在学习,所以我想对变量teks做些什么?对不起,我还是不明白。在你展示最小的、完整的和可验证的代码之前,我什么都说不出来这个问题。