Search code examples
cstringstrcmp

Baffled by strcmp


I have a very simple function to convert a 3 char string representing a bit string to a decimal number:

int bin3_to_dec(char *bin) {
  int result;

  result=0;
  printf("string: %s\n", bin);
  printf("c0: %c\n", bin[0]);
  printf("c1: %c\n", bin[1]);
  printf("c2: %c\n", bin[2]);

  if ((strcmp(&bin[0], "1") == 0))
    result += 4;
  if ((strcmp(&bin[1], "1") == 0))
    result += 2;
  if ((strcmp(&bin[2], "1") == 0))
    result += 1;
  printf("result: %d\n", result);
  return result;
}

When I run the program and feed this function the string 111 it should calculate 7. Instead it outputs this:

string: 111
c0: 1
c1: 1
c2: 1
result: 1

Why is it not calculating the correct value? Why is only the third condition successfully passing?


Solution

  • Your string bin equal "111" really consists of four chars - that is '1', '1', '1', '\0' where the 4th char has the value zero which terminates (i.e. ends) the string.

    So &bin[0] is the string "111"

    and &bin[1] is the string "11"

    and &bin[2] is the string "1"

    So what your code is actually doing is the same as:

      if ((strcmp("111", "1") == 0))
        result += 4;
      if ((strcmp("11", "1") == 0))
        result += 2;
      if ((strcmp("1", "1") == 0))
        result += 1;
    

    Only the last compare results in true so resultbecomes 1