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做些什么?对不起,我还是不明白。在你展示最小的、完整的和可验证的代码之前,我什么都说不出来这个问题。