-1

我是 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;
}

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

4

1 回答 1

9

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

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

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

在您的代码中:

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

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

阅读此链接的图表答案以了解:如何strtok()工作?

编辑:

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

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

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

而在您的代码中:

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

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

于 2013-07-09T15:08:35.347 回答