当我在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
答案 0 :(得分:0)
强烈建议不要使用链接,您应该将整个程序发布在您的问题中。
从您已发布的代码部分和共享的错误信息来看,传递给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
的结果将分配给{ {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
动态分配的内存。
我不是您真正想做的,但是我觉得在您的代码中有很多改进的地方。
希望获得帮助。