C 在if条件下使用关系运算符分割错误
第一个if条件导致分段错误。我真的不明白为什么,因为我在其他地方使用了类似的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
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[]
,则语句“Functionstrtok
将崩溃。”通常是误导性的,不一定是正确的。函数strtok
使用一个指向以null结尾的非常量字符数组的指针。因此,例如,如果您声明const char str[5]
,则调用strtok(str,…)时会出现分段错误(或者更一般地说,未定义的行为)
。由于字符串文字在定义上是常量,因此也不能将其作为函数strtok
的第一个输入参数传递。如果通过动态分配将指针传递到指向内存的strtok
,则我们可以假定常量内存没有问题。