[英]strncpy() segmentation fault: shady strtok() manipulations?
我正在编写一个程序,该程序从用户那里获取行并解析它们以进行作业分配。 我受限于一定的内存量,因此我在下面使用的变量是唯一可以使用的变量。
我的代码出现分段错误,并且使用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 ) );
strtok通过在标记的末尾添加'\\ 0'字符来更改str。 因此,第二次使用str作为参数调用strtok时,它将仅看到字符串的“ 00”部分。 最简单的解决方法是在第一次通过令牌化保存命令部分:
strtok( str, " " );
strncpy( str, strtok( NULL, " " ), sizeof( str ) );
memory[*count] = atoi( strtok( NULL, " " ) );
当然,您还应该检查strtok的返回值,以确保未传递错误的输入。
编辑-糟糕。 我没有意识到您想将命令存储回str中。 将命令部分复制回str应该是安全的,因为它必须比第一个参数+命令短。 它看起来确实有些狡猾。 您最好使用命令的另一个指针变量。 它仅是另一个4-8字节字节(取决于您的系统)。
char *command;
strtok( str, " " );
command = strtok( NULL, " " );
memory[*count] = atoi( strtok( NULL, " " ) );
在我看来,第一件事就是捕获并打印来自strtok()
的返回值,或者在您期望非空返回值时检查它们是否不为空。
给定代码的第二部分:
strtok(str, " ");
strncpy(str, strtok(NULL, " "), sizeof(str));
您正在使用strncpy()
在自身上复制字符串str
。 那是不确定的行为:
如果在重叠的对象之间进行复制,则行为是不确定的。
当您调用未定义的行为时,任何事情都会发生。
只需将第二个令牌指针保存到'str'。 无需复制。
printf( "\n%s\n", str );
strtok( str, " " ); /* apparently you don't care about this token */
str = strtok( NULL, " " ); /* 'str' now points to COMMAND */
memory[*count] = atoi( strtok( NULL, " " ) );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.