Michael_19
Michael_19

Reputation: 4959

Why does segmentation fault (core dumped) error apply to my C program?

I keep getting this error and I am not sure how it applies to my program. This is my program.

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

int nextword(char *str);



void main(void)
{
  char *str = "Hello! Today is a beautiful day!!\t\n";
  int i = nextword(str);
  while(i != -1)
    {
      printf("%s\n",&(str[i]));
      i = nextword(NULL);
    }
}

int nextword(char *str)
{
  // create two static variables - these stay around across calls
  static char *s;
  static int nextindex;
  int thisindex;
  // reset the static variables
  if (str != NULL)
    {
      s = str;
      thisindex = 0;
      // TODO:  advance this index past any leading spaces
      while (s[thisindex]=='\n' || s[thisindex]=='\t' || s[thisindex]==' '                )
    thisindex++;  

    }
  else
    {
      // set the return value to be the nextindex
      thisindex = nextindex;
    }
  // if we aren't done with the string...
  if (thisindex != -1)
    {
      nextindex = thisindex;
      // TODO: two things
      // 1: place a '\0' after the current word
      // 2: advance nextindex to the beginning
      // of the next word
      while (s[nextindex] != ' ' || s[nextindex] != '\n' || s[nextindex] != '\t')
    {
      if ( s[nextindex] == '\0')
        return -1;
      else
        {
          nextindex++;
          if (s[nextindex]==' '||s[nextindex]=='\n'||s[nextindex]=='\t')
        str[nextindex]='\0';
        }
    }

    }
  return thisindex;
}

My program is supposed to have an output to the console of

Hello!
Today
is 
a
beautiful 
day!!

Upvotes: 0

Views: 682

Answers (3)

You should compile with all warnings and debugging info enabled (if using GCC e.g. on Linux, that means compiling with gcc -Wall -g).

Then you should learn how to use the debugger (i.e. gdb on Linux) and possibly a leak detector like valgrind

a segmentation fault may happen if you dereference some "bad" pointer, e.g. a NULL one or an uninitialized one. It also may happen if you write into a read-only segment (you are probably overwriting a string literal which is put into a read-only -so called .text or .rodata- segment)

Taking account of every warning of the compiler (and enabling them) and using a debugger are essential skills of any C programmer.

Upvotes: 4

Ed Heal
Ed Heal

Reputation: 60017

Please give nextindex a initial value

Upvotes: 0

amit
amit

Reputation: 178471

You are trying to change a String literal. This results in undefined behavior, such as a segfault.

str[nextindex]='\0'

and in Here, str is the parameter of nextWord(), which is:

char *str = "Hello! Today is a beautiful day!!\t\n";
int i = nextword(str);

Since "Hello! Today is a beautiful day!!\t\n" is a string literal - changing it is udnefined behavior, and in your case (luckily) it caused a seg-fault.

Upvotes: 5

Related Questions