Ошибка сегментации с использованием операторов отношения в if condidtion

Первое условие if приводит к ошибке сегментации. Я не могу понять, почему, так как я использую подобные предложения if с операторами отношения в другом месте. Заранее спасибо за помощь.

int foo(char *str1,char **str2, char **str3)
{
  char *token1;
  char *token2;
  char *token = strtok(str1, """);
  int spaces = strcmp(token,"  ");
  int parenthesis = strcmp("{",token);
  if((token == NULL) || ((spaces != 0) && (parenthesis != 0))) 
  {
    printf("ERR.n");
    return 0;
  } 
  token = strtok(NULL, """);
  if(token == NULL)
  {  
    printf("2ERRn");
    return 0;
  }
  token1= strtok(NULL, """);
  if(token1 == NULL || strcmp(token1," -> ") != 0)
  {
    printf("3ERRn");
    return 0;
  }
  token2 = strtok(NULL, """);
  return 1;
  }

1 ответ

  1. Произойдет strtokсбой, если вы не используете char[]. Вы можете обойти его с помощью strcpy.

    char str[80];
    strcpy(str, str1);
    char *token = strtok(str, "\"");
    

    Я не уверен, что вы пытаетесь сделать, но ваш код будет работать без сбоев после небольшого изменения.

    #include <stdio.h>
    #include <string.h>
    int foo(char *str1,char **str2, char **str3)
    {
        char *token1;
        char *token2;
    
        char str[80];
        strcpy(str, str1);
        char *token = strtok(str, "\"");
        int spaces = strcmp(token,"  ");
        int parenthesis = strcmp("{",token);
        if((token == NULL) || ((spaces != 0) && (parenthesis != 0)))
        {
            printf("ERR.\n");
            return 0;
        }
        token = strtok(NULL, "\"");
        if(token == NULL)
        {
            printf("2ERR\n");
            return 0;
        }
        token1= strtok(NULL, "\"");
        if(token1 == NULL || strcmp(token1," -> ") != 0)
        {
            printf("3ERR\n");
            return 0;
        }
        token2 = strtok(NULL, "\"");
        return 1;
    }
    int main() {
    
        char * c1, * c2, * c3;
        c1 = "foobaz";
        c2 = "bar";
        c3 = "baz";
    
        int i =  foo(c1, &c2, &c3);
        return 0;
    }