gpt4 book ai didi

c - strncpy() 段错误 : shady strtok() manipulations?

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:34 26 4
gpt4 key购买 nike

我正在编写一个程序,它从用户那里获取台词并解析它们以用于家庭作业。我被限制在一定数量的内存中,所以我在下面使用的变量是我唯一可以使用的变量。

我的代码出现段错误,使用 gdb 发现它源自下面的 strncpy() 函数调用。我能看到发生这种情况的唯一原因是 str 有问题,这是由我使用 strtok() 引起的。如果有人能指出我如何错误地使用 strtok() 或在不添加任何变量的情况下通过空格解析字符串的替代方法,我将不胜感激。

字符串的格式为“00 COMMAND 0”,我试图将最后一位放入数组,同时保留 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, " " ) );

关于c - strncpy() 段错误 : shady strtok() manipulations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com