C fgets仅通过空格时给我一个segfault

C fgets仅通过空格时给我一个segfault,c,segmentation-fault,fgets,C,Segmentation Fault,Fgets,我正在尝试制作一个shell,其中一个条件是当用户进入一堆空间时。然而,当我在终端中输入任意数量的空格时,我从FGET中得到一个segfault。它可以是一个空格,也可以是一整串空格,后跟一个随机字符。我老是犯错误 发展: 我注意到,当我删除标记化函数时,我没有得到segfault。为什么会这样 这是我的密码: #include <stdlib.h> #include <assert.h> #include <string.h> #include <st

我正在尝试制作一个shell,其中一个条件是当用户进入一堆空间时。然而,当我在终端中输入任意数量的空格时,我从FGET中得到一个segfault。它可以是一个空格,也可以是一整串空格,后跟一个随机字符。我老是犯错误

发展: 我注意到,当我删除标记化函数时,我没有得到segfault。为什么会这样

这是我的密码:

#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>


/* Initialize variables and methods */

int status;
int i;
int one_nonspace = -1;
int on = 1;
char input[101];
char temp[101];
char* tokenized;
char operators[3] = {'>', '<', '|'};
char** tokens;



void getInput(char *prmpt, char *buff){

    printf(">:");
    fgets(buff, 101, stdin); //segfault here when input spaces.

    /*printf("works!");*/

    if(one_nonspace != -1){
      printf("spaces");

      memcpy( temp, &buff[i], (101-i) );
      temp[100] = '\0';


    }


    if(buff[strlen(buff) -1] != '\n'){
        int over = 0;

        while(fgetc(stdin) != '\n')
            over++;

        if(over>0)
        {
            printf("Command is over 100 characters. Please try again\n");
            status = 1;
        }
    }

    else{
        buff[strlen(buff) - 1] = '\0';
        status = 0;
    }



}


char** tokenize(char* a_str)
{
    char** result    = 0;
    size_t count     = 0;
    char* tmp        = a_str;
    char* last = 0;
    char delim[2];
    delim[0] = ' ';
    delim[1] = 0;

    /* Count how many elements will be extracted. */
   while (*tmp)
    {
        if (' ' == *tmp)
        {
            count++;
            last = tmp;
        }
        tmp++;
    }

    /* Add space for trailing token. */
    count += last < (a_str + strlen(a_str) - 1);

    /* Add space for terminating null string so caller
       knows where the list of returned strings ends. */
    count++;

    result = malloc(sizeof(char*) * count);

    if (result)
    {
        size_t idx  = 0;
        char* token = strtok(a_str, delim);

        while (token)
        {
            assert(idx < count);
            *(result + idx++) = strdup(token);
            token = strtok(0, delim);
        }
        assert(idx == count - 1);
        *(result + idx) = 0;
    }

    return result;
}



/* Create a parser Feb 2*/


int main(int argc, char **argv){

  while(on){

      getInput(">: ", input);
      tokenized = input;



      if(status == 0){
          /*printf("%s\n", input);*/

      }




      /*Split the line into tokens*/
      if(input[0] != ' ')
        tokens = tokenize(tokenized);

      /*if tokens[0] == 'exit', then quit.
      */

      if(strcmp(*(tokens),"exit") == 0){
        break;}


  /*2/3 Now we need to do something with the split up tokens*/
      /*printf("input after token: %s\n", input);*/
  /*Free the tokens at the end!!! Remember this!*/
      if (tokens)
      {
      int i;
      for (i = 0; *(tokens + i); i++)
      {
          printf("%s\n", *(tokens + i));
          free(*(tokens + i));
      }

      free(tokens);
      }
    }


    return 0;




}
#包括
#包括
#包括
#包括
/*初始化变量和方法*/
智力状态;
int i;
int one_nonspace=-1;
int on=1;
字符输入[101];
炭温[101];
字符*标记化;
字符运算符[3]={'>','问题是:

 /*Split the line into tokens*/
 if(input[0] != ' ')
   tokens = tokenize(tokenized);

 /*if tokens[0] == 'exit', then quit.
 */

 if(strcmp(*(tokens),"exit") == 0){
   break;}
当输入以空格字符开头时,您将跳过标记化函数并尝试取消对标记的引用(空指针)


编辑:您正在尝试使用打印语句进行调试,这是一种有效的方法,但请记住刷新缓冲区,否则在出现任何输出之前,如果崩溃发生,您将无法准确了解问题所在。您可以使用
fflush
显式刷新它们,或者如果您在终端上,只需使用换行符,因为它们是u通常是行缓冲。

对我来说没有崩溃。你在哪个平台上?使它崩溃的最小输入是什么?这是你确切的、实际的代码吗?这里没有崩溃。这是确切的崩溃代码吗?这代码对你来说崩溃了吗?不,这不是我的全部代码。我去掉了一些我认为不必要的东西。我将重新编辑我的代码,这样就可以了在那里。抱歉。更新:代码现在都在那里!segfault位于
if(strcmp(*(tokens),“exit”)==0{
。调试器可以帮助您找到类似的内容。您应该检查
fgets()的返回值
。但是,这可能不是导致崩溃的直接原因。虽然我也认为如果将其显式初始化为
NULL
会更好,但在这种情况下,这并不是绝对必要的。具有静态持续时间的未初始化变量开始时为零。谢谢。我认为您必须将变量声明为
静态即使在全局范围内,也会发生这种情况。在这里阅读一些关于其他问题的文章,我现在发现情况并非如此。