【问题标题】:strtok() - Segmentation Fault [duplicate]strtok() - 分段错误
【发布时间】:2012-11-03 11:43:28
【问题描述】:

可能重复:
strtok giving Segmentation Fault

我尝试使用 strtok 函数将字符串拆分为多个标记,但在此示例中它返回给我一个 seg。故障错误。我哪里错了??

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv){
    int i=0;
    char * string = "HI:HOW:ARE:YOU:?", *tmp;

    while(1){
        if(i==0) tmp=strtok(string,":");
        else tmp=strtok(NULL,":");
        if(tmp==NULL) break;
        printf("%s\n",tmp);
        i++;
    }
    return 1;
}

【问题讨论】:

  • strtok 修改了传递给它的字符串,而你传递给它的是一个字符串文字。
  • 这个问题有很多骗子。另外,请阅读文档您尝试使用的功能。

标签: c segmentation-fault strtok


【解决方案1】:

改变

char * string = "HI:HOW:ARE:YOU:?"

char string [] = "HI:HOW:ARE:YOU:?"

使用 char string [] 你有一个数组,而 char * 你有一个指针。当你声明一个数组时,它会请求空间来分配你的字符串的大小。 char * 字符串创建一个指向文字字符串的指针。

char *string 的问题在于不能更改该点,因为字符串文字通常存储在只读内存中,从而导致undefined behavior 33

(更多详情请阅读https://www.securecoding.cert.org/confluence/display/seccode/STR30-C.+Do+not+attempt+to+modify+string+literals

因此,由于使用 strtok 会修改字符串的内容并将其分解为更小的字符串(令牌),因此您会遇到问题。

【讨论】:

  • 非常感谢!!!现在我明白了:)
  • 我也遇到过这个问题。谢谢你的解释!
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多