-3

I try to write simple C function with strcmp(). But I always get Segmentation fault (core dumped). What is wrong ?

char *arr={"abcdefg"};
char *a = arr[1];

if(strcmp(a, 'b') == 0)
{
    printf("it is b \n");
}
utarid
  • 1,642
  • 4
  • 24
  • 38

3 Answers3

3

What is wrong?

You did not let yourself be helped by the compiler.

Using -Wall -Wextra on GCC (which is by no means the best you can get but rather the bare minimum you should always use), I get:

testme.c: In function ‘main’:
testme.c:6:11: warning: initialization makes pointer from integer without a cast [enabled by default]
 char *a = arr[1];
           ^

You took arr[1] -- which is the char value 'b' -- and turned it into a char *. Your a is now pointing to whatever is at address 0x62 (assuming ASCII), which is most definitely not what you intended. You probably wanted &arr[1], or arr + 1.

Or you wanted a char -- then you shouldn't declare char *, and strcmp() would be the wrong thing to use in the first place.

testme.c:8:1: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
 if(strcmp(a, 'b') == 0)
 ^
In file included from testme.c:1:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘int’
 extern int strcmp (const char *__s1, const char *__s2)
            ^

strcmp() expects two C strings (char const *). Your second argument 'b' is of type int... you probably wanted "b".

Which still would not compare equal, because "bcdefg" is not equal "b"...

Or you wanted a one-character comparison... that would be if ( a == 'b' ) then, with a being of type char, not char * (see above).

testme.c:10:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
     printf("it is b \n");
     ^
testme.c:10:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]

Please do us all the favour of posting complete code, includes, int main() and all, so we can copy & paste & compile, and still have line numbers match.

DevSolar
  • 67,862
  • 21
  • 134
  • 209
0

I think this is what you have been trying to achieve :

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

int main(void)
{
    char *arr = {"abcdefg"};
    char a = arr[1];

    if( a == 'b' )
    {
        printf("it is b \n");
    }
}
machine_1
  • 4,266
  • 2
  • 21
  • 42
0

You're doing a number of things wrong here. strcmp is for comparing strings. The simplest way to do what you want is

char *arr= {"abcdefg"};
char a = arr[1];

if(a == 'b')
{
  printf("it is b \n");
}

If you still want to do it with strcmp, you need to make a a string by appending the null terminator \0 to it.

char *arr= {"abcdefg"};
char a[] = {arr[1], '\0'};

if(strcmp(a, "b") == 0)
{
  printf("it is b \n");
}
rohit89
  • 5,745
  • 2
  • 25
  • 42