当这些行被如下所示注释掉时,此代码有效。但如果这4行被取消注释,则会出现SIGSEV错误 - 字符串's'未初始化。函数调用是如何工作的,而不是循环中的?当循环与函数的数据无关时。
#define yes 1
#define no 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *readline(FILE *f){
char *buff=NULL,*newbuff=NULL,c;
int buf_sz=1,len=0;
int keep_going=yes;
while(keep_going){
c=fgetc(f);
if(c==EOF || c=='\n'){
keep_going=no;
break;
}
if(len==buf_sz-1 && keep_going!=no){
if(!buff){
buf_sz=512;
newbuff=malloc(buf_sz);
}
else{
buf_sz*=2;
newbuff=realloc(buff,buf_sz);
}
buff=newbuff;
}
buff[len++]=c;
}
return buff;
}
int main(){
char *s;
int l,left_mid,right_mid,lp,rp,change=no;
// int n;
// scanf("%d",&n);
// while(n--){
s=readline(stdin);
l=strlen(s);
printf("%d",l);
//}
return 0;
}
答案 0 :(得分:1)
buff
需要以空值终止。
scanf("%d", &n);
保留换行符。
仅输入换行符时,缓冲区不受保护。
修复示例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *readline(FILE *f){
char *buff=NULL,*newbuff=NULL;
int c;
int buf_sz=512,len=0;
buff=malloc(buf_sz);
if(!buff) return NULL;
while(EOF != (c=fgetc(f)) && c != '\n'){
if(len == buf_sz -1){
buf_sz*=2;
newbuff=realloc(buff,buf_sz);
if(newbuff==NULL){
free(buff);
return NULL;
}
buff=newbuff;
}
buff[len++]=c;
}
buff[len]='\0';
return buff;
}
int main(){
char *s;
int n, l;
scanf("%d%*c",&n);
while(n--){
s=readline(stdin);//check return value
l=strlen(s);
printf("%d\n", l);
free(s);
}
return 0;
}