首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C: STRTOK异常

C: STRTOK异常
EN

Stack Overflow用户
提问于 2013-12-28 17:42:35
回答 3查看 1.8K关注 0票数 6

由于某种原因,我在第一次使用strtok()时得到了一个异常,我试图完成的是一个简单地检查子字符串是否在字符串中重复自身的函数。但是到目前为止我还没有让strtok去工作

代码语言:javascript
复制
int CheckDoubleInput(char* input){
char* word = NULL;
char cutBy[] = ",_";

word = strtok(input, cutBy);  <--- **error line**

/* walk through other tokens */
while (word != NULL)
{
    printf(" %s\n", word);
    word = strtok(NULL, cutBy);
}
return 1;
}

main调用函数:

代码语言:javascript
复制
CheckDoubleInput("asdlakm,_asdasd,_sdasd,asdas_sas");

EN

回答 3

Stack Overflow用户

发布于 2013-12-28 18:49:14

CheckDoubleInput()很好。看看这个。希望你能理解

代码语言:javascript
复制
int main(){
    char a[100] = "asdlakm,_asdasd,_sdasd,asdas_sas";
    // This will lead to segmentation fault.
    CheckDoubleInput("asdlakm,_asdasd,_sdasd,asdas_sas");
    // This works ok.
    CheckDoubleInput(a);
    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2013-12-28 18:06:43

strtok函数修改了它的第一个输入(解析后的字符串),因此不能传递指向常量字符串的指针。在您的代码中,您正在传递一个指向char[N]类型的字符串文本的指针(即。编译常量字符串),因此试图修改常量字符串文字,这是未定义的行为。在此之前,您必须将字符串复制到临时缓冲区中。

代码语言:javascript
复制
char* copy = strdup("asdlakm,_asdasd,_sdasd,asdas_sas");
int result = CheckDoubleInput(copy);
free(copy);

以下是man page for strtok所说的:

错误

使用这些函数时要小心。如果您确实在使用它们,请注意:

这些函数修改了它们的第一个argument.

  • These函数,不能在常量字符串上使用。

  • 分隔字节的标识丢失了。

  • strtok()函数在解析时使用静态缓冲区,因此它不是线程安全的。如果这对您很重要,请使用strtok_r()
票数 1
EN

Stack Overflow用户

发布于 2013-12-28 17:49:44

要么是input在某种程度上不好。尝试在调用strtok之前打印它,或者您正在通过GCC编译器在多线程上使用strtok。一些编译器有一个称为'strtok_r‘的线程安全版本。Visual Studio已将原始函数修复为线程安全。

修改后的答案显示您正在传递一个只读的字符串文字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20813073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档