C 在if条件下使用关系运算符分割错误

C 在if条件下使用关系运算符分割错误,c,if-statement,segmentation-fault,operator-keyword,relational,C,If Statement,Segmentation Fault,Operator Keyword,Relational,第一个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); i

第一个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("2ERR\n");
    return 0;
  }
  token1= strtok(NULL, "\"");
  if(token1 == NULL || strcmp(token1," -> ") != 0)
  {
    printf("3ERR\n");
    return 0;
  }
  token2 = strtok(NULL, "\"");
  return 1;
  }

如果不使用
char[]
,strtok将崩溃。您可以使用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;
}
#包括
#包括
int foo(字符*str1,字符**str2,字符**str3)
{
字符*1;
字符*2;
char-str[80];
strcpy(str,str1);
char*token=strtok(str,“\”);
int spaces=strcmp(标记“”);
int括号=strcmp(“{”,标记);
if((标记==NULL)| |((空格!=0)&&&(括号!=0)))
{
printf(“ERR.\n”);
返回0;
}
token=strtok(NULL,\);
if(标记==NULL)
{
printf(“2ERR\n”);
返回0;
}
token1=strtok(NULL,\);
if(token1==NULL | | strcmp(token1,“->”))=0)
{
printf(“3ERR\n”);
返回0;
}
token2=strtok(NULL,\”);
返回1;
}
int main(){
字符*c1、*c2、*c3;
c1=“foobaz”;
c2=“巴”;
c3=“baz”;
int i=foo(c1、c2和c3);
返回0;
}

此代码段中声明了
parent
在哪里?定义了
name\u a
parent
在哪里?如果它是字符串文本或其他常量内存,
strok()
在试图将
\'0'
写入字符串时会造成问题。你确定你甚至达到了
if
语句吗?你是在调试器中运行的吗?@Gerhardh Str1是在动态内存中分配的。为什么不提供你真正运行的代码呢?因为你显然为此创建了一些不同的东西,你可能很容易错过d重要部分。顺便说一句:您使用令牌时没有检查
NULL
。如果不使用
char[]
,则语句“Function
strtok
将崩溃。”通常是误导性的,不一定是正确的。函数
strtok
使用一个指向以null结尾的非常量字符数组的指针。因此,例如,如果您声明
const char str[5]
,则调用
strtok(str,…)时会出现分段错误(或者更一般地说,未定义的行为)
。由于字符串文字在定义上是常量,因此也不能将其作为函数
strtok
的第一个输入参数传递。如果通过动态分配将指针传递到指向内存的
strtok
,则我们可以假定常量内存没有问题。