[英]segmentation fault on reading string
我有一个从标准输入读取字符串的函数,它基于这里的答案,
char* ReadString (FILE* f) {
int chr;
int n=0;
size_t size=4;
char *st=(char*)malloc(size*sizeof(char));
while (((chr=fgetc(f))!='\n') && (chr != EOF) ) {
st[n]=chr;
if (n+1==size)
st=(char*)realloc(st,(size+=8)*sizeof(char));
n++;
}
st[n]='\0';
return (char*)realloc(st,sizeof(char)*n);
}
好吧,功能正常,但我发现了一个问题。
int k;
printf("number\n");
scanf("%d",&k);
while (!loop) { //infinite loof for tests
printf("Name of the file and distination\n");
fname= ReadString(stdin);
printf("\"%s\"\n",fname);
}
现在我会得到一个分段错误。 好吧,正如我所理解的,问题是在 scanf 之后,在标准输入中留下了“\\n”。 如果我把
while ( getchar() != '\n' ); // clean stdin
fname= ReadString(stdin);
比我不会得到分段错误,第一个字符串将完美读取但下一个字符串将无法正确读取我需要输入两次。 为什么 (((chr=fgetc(f))!='\\n') && (chr != EOF) ) 不起作用? - - - - - - -回答 - - - - - - -
基于下面的答案,这里是未来的代码。
char* ReadString (FILE* f) {
int chr;
int n=0;
size_t size=4;
char *st=(char*)malloc(size);
bool loop=false;
while (!loop) {
while (((chr=fgetc(f))!='\n') && (chr != EOF) ) {
st[n]=chr;
if (n+1==size)
st=(char*)realloc(st,(size+=8)*sizeof(char));
n++;
}
loop=true;
if (n==0)
loop=false;
}
if (n!=0 )
st = (char*)realloc(st,sizeof(char)*n);
st[n]='\0';
return st;
}
您在上一次realloc
出现了一个错误。 您的字符串存储n+1
个字节,但您将分配缩短为n
个字节。
如果读取的第一个字符是换行符,则循环永远不会运行。 您的st
字符串由 0 个字符组成,后跟一个'\\0'
终止符,即它使用 1 个字节的存储空间。
但是n
是0
,因此realloc(st,sizeof(char)*n)
将其重新分配为 0 字节,这可能会释放字符串(或返回指向 0 字节内存的指针,不得取消引用)。
最简单的解决方案是只return st
而不重新分配它。 否则它应该类似于return realloc(st, n+1);
(但你真的应该检查所有的realloc
调用是否有错误)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.