strtok导致段错误,但不是在单步执行代码时

Boa*_*rdy -1 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);
Run Code Online (Sandbox Code Playgroud)

以下是功能

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;
}
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助,您可以提供.

Gri*_*han 9

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

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

str
C字符串截断.
请注意,此字符串的内容将被修改并分解为较小的字符串(标记).或者,可以指定空指针,在这种情况下,该函数继续扫描先前成功调用该函数的位置.

在你的代码中:

 strtok(dateString, " "); 
           ^
           |  is a constant string literal 
Run Code Online (Sandbox Code Playgroud)

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

阅读这个链接的答案,了解图表:如何strtok()运作?

编辑:

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

char str[] ="- This, a sample string.";
Run Code Online (Sandbox Code Playgroud)

str[]是一个nul终止的字符数组,用字符串初始化,其长度等于指定字符串的大小.您可以更改str[]例如str[i] = 'A'有效操作的内容.

而在你的代码中:

char * dateTimeString = "2011/04/16 00:00"; 
Run Code Online (Sandbox Code Playgroud)

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