Home > Blockchain >  Test Crashed Caught unexpected signal: SIGSEGV (11). Invalid memory access
Test Crashed Caught unexpected signal: SIGSEGV (11). Invalid memory access

Time:11-11

I solved the codewars training as below. I'm getting an error message, what's wrong in the code? I don't know what is going on, so please let me know. But it is capitalizing every word!

I passed: 111 tests Failed: 1 Errors: 1 Exit Code: 1

**Test Crashed Caught unexpected signal: SIGSEGV (11). Invalid memory access. **

It is a Jaden Casing Strings (It is capitalizing every word!)

char *to_jaden_case (char *jaden_case, const char *string){
// write to jaden_case and return it
  int i = 0;
  if(*(string) <= 'z' && *(string) >= 'a'){
    *(jaden_case) = *(string) - 32;
  }
  else{
    *(jaden_case) = *(string);
  }
  for(i = 1;*(string   i) != '\0'; i  ){
    if( *(string   i - 1) == ' '){
      if(*(string   i) <= 'z' && *(string   i) >= 'a'){
        *(jaden_case   i) = *(string   i) - 32;
      }
      else{
        *(jaden_case   i) = *(string   i);
      }
    }
    else{
      *(jaden_case   i) = *(string   i);
    }
  }
  *(jaden_case   i) = '\0';
  return jaden_case;
}

CodePudding user response:

The first test case is the empty string:

Test(tests_suite, fixed_tests)
{
  sample_test(
    "",
    ""
  );
  /* ... */

In that case, the following

for(i = 1;*(string   i) != '\0'; i  )

will cause Undefined Behaviour when accessing an invalid index via string[1].


Consider using the functions found in <ctype.h>, such as isspace and especially toupper to solve this.

Generally, consider using the syntax foo[n], instead of *(foo n).

That said, the minimal change required for your code is to place the for loop inside a guarding if that checks if the string is at least one character long.

if (*string) {
   for (/* ... */) {
       /* ... */
}

I might suggest doing this, and then having a look at the more well received solutions.

  • Related