当我在 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;
}
在 while(teks[lokasi]!='\n')
上,它表示读取冲突访问。 teks
为 0x1110113
最佳答案
强烈建议不要使用链接,您的期望是,您应该在问题中发布整个程序。
从您发布的代码部分和共享的错误信息来看,传递给 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) {
首先,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
是您的好 helper 。
此外,在 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
则仅使用它。
此外,请确保在使用完动态分配的内存后释放
它。
我不知道你到底想做什么,但我觉得你的代码有很大的改进空间。
希望这有帮助。
关于c - 读取访问冲突变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53941967/