【发布时间】:2014-03-21 04:45:02
【问题描述】:
我正在编写一个程序,该程序从用户那里获取行并解析它们以完成家庭作业。 我受限于一定数量的内存,所以我下面使用的变量是我唯一可以使用的变量。
我的代码出现分段错误,使用 gdb 发现它源自下面的 strncpy() 函数调用。我能看到发生这种情况的唯一原因是 str 有问题,这是由于我使用 strtok() 引起的。如果有人能指出我如何错误地使用 strtok() 或另一种通过空格解析字符串而不添加任何变量的方法,我将不胜感激。
字符串的格式为“00 COMMAND 0”,我试图将最后一位放入数组中,同时保留 COMMAND 以供以后计算。 COMMAND 的长度从 3 到 4 个字符不等。
char str[11];
*count = 0;
while( scanf( "%[^\n]%*c", str ) == 1 )
{
printf( "\n%s\n", str );
strtok( str, " " );
strtok( NULL, " " );
memory[*count] = atoi( strtok( NULL, " " ) );
strtok( str, " " );
strncpy( str, strtok( NULL, " " ), sizeof( str ) );
【问题讨论】:
-
不管你在做什么,
atoi( strtok总是有风险的,因为strtok可能返回 NULL。在传递给atoi(或strncpy)之前检查返回值。 -
还要注意
strncpy不会在源字符串长到足以填满它的缓冲区时终止它的缓冲区;因此,如果您以后想以字符串的形式访问str,那么明智的做法是在末尾加上'\0',或者更好的是,完全避免strncpy。 -
我会完全避免使用 strncpy,因为我知道它的问题,但我需要使用的编译器设置不支持替代方案。
标签: c string segmentation-fault