当我在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')
上显示读取违例访问。 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
是您的朋友。同样,在
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
,则仅使用它。另外,完成后,请确保
free
动态分配的内存。我不是您到底想做什么,但是我觉得在您的代码中有很多改进的地方。
希望对您有所帮助。
关于c - 读取访问冲突变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53941967/