为什么会出现细分错误11(使用fget读取输入并将其存储在数组中)?

时间:2018-11-15 17:35:00

标签: c arrays fgets fault

很抱歉,如果这是一个非常菜鸟的问题,我是C语言的初学者,并且在理解指针和其他概念方面遇到了很大的麻烦,这使它非常困难。出现细分错误,我不知道为什么需要帮助。我认为可能是由于使用数组来存储。另外,如果您可以推荐调试器,则将非常有帮助。预先感谢。

 #include <stdio.h>

 #include <string.h>


char *lineaccept(char *buf, size_t sz){ //Getting inputs using fgets() and storing it in buf.
        if(fgets(buf,sz,stdin)==NULL){
            printf("ERROR\n");
            return NULL;
        }
        if(strlen(buf) == 1) {
                printf("ERROR\n");
                return NULL;
        }
        return buf;
        }


void delimitLine(char *buf, char *delimited[], size_t max){ //Taking the string from buf and getting each individual word to store in split[]

if(buf != NULL){
    const char s[2] = " ";
    char *token;
    token = strtok(buf, s);
    int counter = 0;
    while( token != NULL && counter <= max){
        split[counter] = token;
        token = strtok(NULL, s); 
        counter ++;
    }
    for(int y = 0; y < counter; y++){
        if(split[y]==NULL){
            break;
        }else{
            printf("%s\n",split[y]);
        }
    }
}

}

int main(void) {
    const int maxWords = 10;
    char maxLenInput[11];
    char *arrOfWords[100];
    char inputFromLine[100];
    while(strcmp((strcpy(inputFromLine,lineaccept(maxLenInput, maxWords))), "")>0) {
        delimitline(inputFromLine, arrOfWords, maxWords);
    }


     return 0;
}

1 个答案:

答案 0 :(得分:0)

如果您在控制台中仅按Enter键(未在“ Enter”之前键入任何其他字符),则代码的以下部分将返回NULL。这是因为fgets将新行存储为buf中的唯一字符,这样strlen(buf)将是1,然后:

char *read_line(char *buf, size_t sz){
   .... 
   if (fgets(buf,sz,stdin)) {
      if(strlen(buf) == 1) {
         return NULL;
         ...

然后,您将通话结果传递给read_linestrcpy,就像您一样

strcpy(inputFromLine,read_line(maxLenInput, maxWords)

然后您实际上将NULL传递给strcpy并由此访问“无效”内存;不确定的行为,可能是段错误。