c - strtok 导致段错误,但在单步执行代码时则不会

标签 c strtok

我是 C 新手,我正在尝试将日期/时间字符串拆分为单独的变量。然而,当我在 gdb 中逐行单步执行代码时,它可以工作,但是,当我让它在没有断点的情况下正常运行时,它会出现段错误,我不明白为什么。

下面是代码:

char * dateTimeString = "2011/04/16 00:00";
char dateVar[11];
char timeVar[6];

if (splitTimeAndDateString(dateVar, timeVar, dateTimeString))
{
    exit(1);
}

printf("Date: %s\tTime: %s\n", dateVar, timeVar);

下面是函数

int splitTimeAndDateString(char date[11], char time[6], char * dateString)
{
    char *token;
    token = strtok(dateString, " ");
    int i = 0;
    while (token != NULL)
    {
        if (i == 0)
        {
            strcpy(date, token);
        }
        else if (i == 1)
        {
            strcpy(time, token);
        }
        else
        {
            printf("Overrun date time string\n");
            return 1;
        }
        token = strtok(NULL, " ");
        i++;
    }
    return 0;
}

感谢您提供的任何帮助。

最佳答案

strtok()函数修改要解析的字符串,并将所有分隔符替换为\0 nul符号。

阅读:char * strtok ( char * str, const char * delimiters );

str
C string to truncate.
Notice that the contents of this string are modified and broken into smaller strings (tokens). Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.

在您的代码中:

 strtok(dateString, " "); 
           ^
           |  is a constant string literal 

dateString 指向 "2011/04/16 00:00" 常量字符串文字,并使用 strtok() 您的代码尝试在只读内存上写入 - 这是非法的,这会导致段错误。

阅读此内容 linked answer for diagram了解:strtok() 是如何工作的?

编辑:

@:char * strtok ( char * str, const char * delimiters );在给定的代码示例中,str 是一个数组,而不是常量字符串文字。它的声明:

char str[] ="- This, a sample string.";

这里str[]是一个以nul结尾的字符数组,它用字符串初始化,其长度等于分配的字符串的大小。您可以更改 str[] 的内容,例如str[i] = 'A' 是一个有效的操作。

而在您的代码中:

char * dateTimeString = "2011/04/16 00:00"; 

dateTimeString 是指向不可修改的字符串文字的指针,例如 dateTimeString[i] = 'A' 这次是非法操作。

关于c - strtok 导致段错误,但在单步执行代码时则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551665/

相关文章:

C 添加 strtok 到 char*

c++ - 移动 strchr 指针后使用 strtok

c - strtok 带有逗号空格和制表符

c - 轮询系统调用是否知道远程套接字是关闭还是断开?

c - 插入排序 : order numbers over 2^32

c - 将枚举类型转换为 void* 是错误的/危险的吗?

C 编程 - 从文本文件的同一行中读取 2 个不同的目录

c - TCP 套接字在 C 程序中失败并显示 "endpoint is not connected"

c++ - 在 C++ 中使用 strtok 解析命令行参数

C编程: reading and writing binary files