繁体   English   中英

strncpy()分段错误:不可靠的strtok()操纵?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM