无法从循环内的stdin读取

时间:2014-01-02 21:27:55

标签: c debugging stdin

当这些行被如下所示注释掉时,此代码有效。但如果这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;

          }

1 个答案:

答案 0 :(得分:1)

  1. buff需要以空值终止。

  2. scanf("%d", &n);保留换行符。

  3. 仅输入换行符时,缓冲区不受保护。


  4. 修复示例

    #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;
    
    }