我是 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/