为什么我会收到 Segmentation fault 11(使用 fgets 读取输入并存储在数组中)?

Why am I getting Segmentation fault 11 (reading inputs using fgets and storing in array)?

很抱歉,如果这是一个非常菜鸟的问题,我是 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;
}

如果您在控制台中仅按 Enter(没有在 "Enter" 之前键入任何其他字符),则代码的以下部分将 return 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_line 的调用结果传递给 strcpy 时,就像您对

所做的那样
strcpy(inputFromLine,read_line(maxLenInput, maxWords)

然后你实际上将 NULL 传递给 strcpy 并由此访问 "invalid" 内存;未定义的行为,可能是段错误。