C段中的文件I/O错误
我知道分段错误是什么,我不需要知道它的定义:) 我只需要知道它是从我的代码里来的。这个程序的目的是将单词作为输入,从文本文件中读取,写入单独的文本文件,然后打印读取文件和输入中的所有单词C段中的文件I/O错误,c,file,pointers,malloc,C,File,Pointers,Malloc,我知道分段错误是什么,我不需要知道它的定义:) 我只需要知道它是从我的代码里来的。这个程序的目的是将单词作为输入,从文本文件中读取,写入单独的文本文件,然后打印读取文件和输入中的所有单词 #include<stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char*argv[]){ FILE *read; FILE *write; char **li
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char*argv[]){
FILE *read;
FILE *write;
char **list=malloc(sizeof(char*));
char **oldlist=malloc(sizeof(char*));
char *oldword=malloc(sizeof(char));
char exit[]="end";
int a, c, r=0, w=0, n=0, z= 0, y=0, d=0, g=0;
//check arg
for(a=0; a<argc; a++){
if(strcmp(argv[a], "-r")==0){
r =1;
read=fopen("read.txt", "r");
}
else if(strcmp(argv[a], "-w")==0){
w =1;
write=fopen("write.txt", "w");
}
}
if(r==0 && w==0){
printf("Error: Invalid Command.\n");
}
printf("Read = %d | Write = %d\n", r, w);
//getwords
printf("Enter your words: ");
while(1){
char *word=malloc(sizeof(char));
list=realloc(list, sizeof(char*)*(z+10));
word=realloc(word, sizeof(char)*(z+10));
scanf("%s", word);
if (strcmp(word,exit)==0){
break;
}
else{
*(list+z) = word;
z++;
}
}
//read
if (r==1){
do{
while(1){
*(oldword+d)=fgetc(read);
d++;
}
}while(feof(read) != 0);
}
*(oldword+(d-1))="\0";
printf("Your words are:\n");
puts(oldword);
for(c=0; c<n; c++){
puts(*(list+c));
}
//write
if (w ==1){
if(w==1){
fputs(*(oldlist+c),write);
}
for(c=0; c<n; c++){
fputs(*(list+c),write);
}
}
//end
free(list);
fclose(read);
fclose(write);
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
文件*读取;
文件*写入;
char**list=malloc(sizeof(char*));
char**oldlist=malloc(sizeof(char*));
char*oldword=malloc(sizeof(char));
字符退出[]=“结束”;
int a,c,r=0,w=0,n=0,z=0,y=0,d=0,g=0;
//检查arg
对于(a=0;a如果您在调试打开(g标志)的情况下编译并在valgrind下运行,它应该可以很好地指示它为什么会出现seg故障。如果您在调试打开(g标志)的情况下编译并在valgrind下运行,它应该可以很好地指示它为什么会出现seg故障。您可以为单词分配1个字节:
char *word=malloc(sizeof(char));
然后读入一个字符串。这是一个缓冲区溢出,会导致极大的不快(以及像堆栈溢出这样的问题)。具体来说,读入长单词会践踏“heap”(由malloc()
等控制的数据空间)中的控制信息和用于确定哪些空间可供使用,哪些空间不可供使用的加扰数据。构成“长字”的内容取决于系统;从技术上讲,除空字符串(仅为一个终端“\0”
)外的任何字符串都太长,但如果字的长度小于等于7字节,则可能会导致蓝色谋杀
但是realloc不应该解决内存问题吗?我正在尝试使字符串输入不受限制
嗯……作为一种做生意的方式,这有点奇怪,但是在你真正使用它之前的word
的realloc()
具体地说,在循环第一次溢出word
的内存分配之前,您最多可以读取9个字符(包括9个字符)。但是,要使其“无限”,还有很长一段路要走,而使其无限是非常重要的。一个问题是%s
停止扫描空白字符;这在总的来说,这是您的优势。另一个优势是您似乎在使用z
作为您输入的字符串数量的计数,以及您可以输入的字符串的长度。如果列表超过10个条目,您就不会重新分配list
您仍然可能会遇到各种问题。例如,您对oldword的处理不会执行额外的realloc();它只分配一个字节。然后您会有一个完全无界的无限循环(如果输入了)。此循环是一场灾难:
while(1){
*(oldword+d)=fgetc(read);
d++;
}
为单词分配1个字节:
char *word=malloc(sizeof(char));
然后读入一个字符串。这是一个缓冲区溢出,会导致极大的不快(以及像堆栈溢出这样的问题)。具体来说,读入长单词会践踏“heap”(由malloc()
等控制的数据空间)中的控制信息和用于确定哪些空间可供使用,哪些空间不可供使用的加扰数据。构成“长字”的内容取决于系统;从技术上讲,除空字符串(仅为一个终端“\0”
)外的任何字符串都太长,但如果字的长度小于等于7字节,则可能会导致蓝色谋杀
但是realloc不应该解决内存问题吗?我正在尝试使字符串输入不受限制
嗯……作为一种做生意的方式,这有点奇怪,但是在你真正使用它之前的word
的realloc()
具体地说,在循环第一次溢出word
的内存分配之前,您最多可以读取9个字符(包括9个字符)。但是,要使其“无限”,还有很长一段路要走,而使其无限是非常重要的。一个问题是%s
停止扫描空白字符;这在总的来说,这是您的优势。另一个优势是您似乎在使用z
作为您输入的字符串数量的计数,以及您可以输入的字符串的长度。如果列表超过10个条目,您就不会重新分配list
您仍然可能会遇到各种问题。例如,您对oldword的处理不会执行额外的realloc();它只分配一个字节。然后您会有一个完全无界的无限循环(如果输入了)。此循环是一场灾难:
while(1){
*(oldword+d)=fgetc(read);
d++;
}
但是realloc不应该解决内存问题吗?我正在尝试使字符串输入不受限制。嗯……作为一种做生意的方式,这有点奇怪,但是realloc()word
的
在实际使用之前可以解决一些问题。具体来说,在溢出word
的内存分配之前,您可以读取多达9个字符(包括9个字符)。但是,要使其“无限制”还有很长的路要走,而且使其无限制也不是一件小事。一个问题是%s
停止在空白处扫描字符;总的来说,这对您有利。您仍然可能会遇到各种问题。您对oldword
的处理不会产生额外的realloc()例如,
。但是realloc不应该解决内存问题吗?我正在尝试使字符串输入不受限制。嗯……作为一种处理业务的方式,这有点奇怪,但是,realloc()word
的
在实际使用之前可以解决一些问题。具体来说,在溢出word
的内存分配之前,您可以读取多达9个字符(包括9个字符)。但是,要使其“无限制”还有很长的路要走,而且使其无限制也不是一件小事。一个问题是%s
停止在空白处扫描字符;总的来说,这对您有利。您仍然会遇到各种问题。您的手