title: Trouble creating a shell in C (Seg-Fault and ferror)
body: <p>I have been following a tutorial on how to make my own shell but I have been stuck for a couple days now.</p>
  
  <p>Two things:</p>
  
  <ol>
  <li>When this code is compiled and ran, it will randomly have segmentation faults and I cannot figure out why.</li>
  <li>The if statement `if (ferror != 0)` always seems to be true. which is odd because I do not understand why <strong>fgets()</strong> is failing in the <strong>main()</strong> function.</li>
  </ol>
  
  <p>Any information on these topics (or other topics about creating this shell) would be greatly appreciated. </p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;sys/types.h&gt;
  
  #define MAXSIZE 512
  
  int parseCmd(char *cmd, char *args[])
  {
      printf("LOGGER: parseCmd(cmd=%s, args=%p)\n", cmd, args);
  
      char cmdDelims[] = {' ','&gt;'};
  
      char *cmdReader;
      cmdReader = strtok(cmd, cmdDelims);
  
      int i = 0;
      while (cmdReader != NULL)
      {       
          args[i] = strdup(cmdReader);
  
          printf("LOGGER: args[%d]=%s\n", i, args[i]);
  
          cmdReader = strtok(NULL, cmdDelims);
          i++;
      }
      return 0;
  }
  
  void printToLine(char *args[])
  {
      int length;
      length = sizeof(args) / sizeof(char);
  
      int i = 0;
      while (i &lt; length)
      {
          printf("%s\n", args[i]);
          i++;
      }
  }
  
  int main(int argc, char *argv[]) 
  {   
      char *in;
      in = malloc(MAXSIZE);
  
      char *args[15];
      char *cmd = NULL;
  
      int errorBit = 0;
      int terminationBit = 1;
      char error_message[30] = "An error has occurred\n";
  
      char inDelims[] = "\n";
  
      while (terminationBit)
      {
          printf("mysh&gt;");
  
          // get input from command line
          fgets(in, MAXSIZE, stdin);
          if (ferror != 0)
          {
              perror(error_message);
          }
  
          // get pointer to command line input w/o the newline
          cmd = strtok(in, inDelims);
  
          // parse the command into separate arguments
          errorBit = parseCmd(cmd, args);
          if (errorBit)
          {
              perror(error_message);
              exit(1);
          }
  
          printToLine(args);
  
          // check if the user wants to exit the shell
          if (strcmp(*args, "exit") == 0)
          {
              terminationBit = 0;
          }
      }
      return 0;
  }
  </code></pre>
  
  <p><strong>Here are some outputs:</strong></p>
  
  <pre><code>**[ray@12] (6)$ mysh**
  mysh&gt;1 2 3
  An error has occurred
  : Success
  LOGGER: parseCmd(cmd=1 2 3, args=0x7fff4a50b080)
  LOGGER: args[0]=1
  LOGGER: args[1]=2
  LOGGER: args[2]=3
  1
  2
  3
  Segmentation fault (core dumped)
  **[ray@12] (7)$ mysh**
  mysh&gt;1 2 3 4 5 6 7 8 9 10
  An error has occurred
  : Success
  LOGGER: parseCmd(cmd=1 2 3 4 5 6 7 8 9 10, args=0x7fffba053d70)
  LOGGER: args[0]=1
  LOGGER: args[1]=2
  LOGGER: args[2]=3
  LOGGER: args[3]=4
  LOGGER: args[4]=5
  LOGGER: args[5]=6
  LOGGER: args[6]=7
  LOGGER: args[7]=8
  LOGGER: args[8]=9
  LOGGER: args[9]=10
  1
  2
  3
  4
  5
  6
  7
  8
  mysh&gt;1 2 3
  An error has occurred
  : Success
  LOGGER: parseCmd(cmd=1 2 3, args=0x7fffba053d70)
  LOGGER: args[0]=1
  LOGGER: args[1]=2
  LOGGER: args[2]=3
  1
  2
  3
  4
  5
  6
  7
  8
  </code></pre>