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); 

以下是function

 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);

海峡
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[]的内容,例如str[i] = 'A'是有效的操作。

而在你的代码中:

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

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