首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strncpy()分段错误: shady strtok()操作?

strncpy()分段错误: shady strtok()操作?
EN

Stack Overflow用户
提问于 2014-03-21 04:45:02
回答 3查看 294关注 0票数 1

我正在编写一个程序,从用户那里提取行,并将它们解析为作业作业。我被限制在一定数量的内存,所以我使用下面的变量是我唯一可以使用的。

我的代码有一个分段错误,使用gdb发现它起源于下面的strncpy()函数调用。我看到这种情况发生的唯一原因是str有问题,这是由我使用strtok()引起的。如果有人能指出我如何不正确地使用strtok(),或者使用空白解析字符串的替代方法而没有添加任何变量,我会非常感激的。

字符串的格式为"00命令0",我试图将最后一个位放入数组中,同时保留该命令以供以后的计算。命令的长度从3到4个字符不等。

代码语言:javascript
复制
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 ) );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-21 04:49:38

strtok通过在令牌末尾添加'\0‘字符来更改str。因此,第二次使用str作为参数调用strtok时,它只会看到字符串的"00“部分。最简单的修复方法是第一次通过令牌化将命令部分保存下来:

代码语言:javascript
复制
strtok( str, " " );
strncpy( str, strtok( NULL, " " ), sizeof( str ) );
memory[*count] = atoi( strtok( NULL, " " ) );

当然,您还应该检查strtok的返回值,以确保没有传递不正确的输入。

编辑-哎哟。我不知道你想把命令存储回str。将命令部分复制回str应该是安全的,因为它必须比第一个参数+命令短。不过看上去确实有点诡异。使用命令的另一个指针变量会更好。它仅为4-8字节(取决于您的系统)。

代码语言:javascript
复制
char *command;
strtok( str, " " );
command = strtok( NULL, " " );
memory[*count] = atoi( strtok( NULL, " " ) );
票数 2
EN

Stack Overflow用户

发布于 2014-03-21 04:59:22

在我看来,要做的第一件事是捕获并打印来自strtok()的返回值,或者在您期望非空返回时检查它们是否为空。

鉴于守则的第二部分:

代码语言:javascript
复制
strtok(str, " ");
strncpy(str, strtok(NULL, " "), sizeof(str));

您正在使用strncpy()复制字符串str本身的一个片段。这是未定义的行为:

如果复制发生在重叠的对象之间,则行为是未定义的。

当您调用未定义的行为时,任何事情都可能发生。

票数 0
EN

Stack Overflow用户

发布于 2014-03-21 05:25:36

只需保存指向“str”的第二个令牌指针即可。不需要复制。

代码语言:javascript
复制
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, " " ) );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22550352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档