我正在编写一个程序,从用户那里提取行,并将它们解析为作业作业。我被限制在一定数量的内存,所以我使用下面的变量是我唯一可以使用的。
我的代码有一个分段错误,使用gdb发现它起源于下面的strncpy()函数调用。我看到这种情况发生的唯一原因是str有问题,这是由我使用strtok()引起的。如果有人能指出我如何不正确地使用strtok(),或者使用空白解析字符串的替代方法而没有添加任何变量,我会非常感激的。
字符串的格式为"00命令0",我试图将最后一个位放入数组中,同时保留该命令以供以后的计算。命令的长度从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 ) );发布于 2014-03-21 04:49:38
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, " " ) );发布于 2014-03-21 04:59:22
在我看来,要做的第一件事是捕获并打印来自strtok()的返回值,或者在您期望非空返回时检查它们是否为空。
鉴于守则的第二部分:
strtok(str, " ");
strncpy(str, strtok(NULL, " "), sizeof(str));您正在使用strncpy()复制字符串str本身的一个片段。这是未定义的行为:
如果复制发生在重叠的对象之间,则行为是未定义的。
当您调用未定义的行为时,任何事情都可能发生。
发布于 2014-03-21 05:25:36
只需保存指向“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, " " ) );https://stackoverflow.com/questions/22550352
复制相似问题