gpt4 book ai didi

c - strtok 只返回一个标记

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:44 25 4
gpt4 key购买 nike

我正在编写一个简单的 shell,它接受一些标准命令,例如 C 中的 cd 和 ls。我正在尝试实现一个用户可以输入“;”的功能。在命令之间,以便可以将一堆命令写在同一行上并分别执行。因此,如果我输入“cd Desktop; ls”,shell 应该 cd 到桌面并打印目录中的内容。问题是它只执行第一个命令。这是我的主要方法:

char input[1024];

while(1)
{
printf("%s ", prompt);
fgets(input, 1024, stdin);

char delims[] = ";";
char *result = NULL;
result = strtok( input, delims );

while( result != NULL )
{
printf("%s\n", result);

char * copy = malloc(strlen(result) + 1); //Create a copy of the input token
strcpy(copy, result);

format(copy);

if(programs)
{
handle();
cleanup(programs);
programs = NULL;
}
free(copy);
result = strtok( NULL, delims );
cmdno++;
}
}

首先,我尝试根据“;”将输入分解为标记然后将 token 提供给 format() 方法,如下所示:

int format(char input[])
{
input = strtok(input, "\n");
...
}

我知道 strtok 会更改原始字符串,这就是为什么我先创建 token 的副本,然后再将其传递给格式。我做的对吗??

最佳答案

您不能混合使用多个 strtok 调用。这是正在发生的事情:

  • 您开始拆分输入,以便strtok 记录并在内部存储内容
  • 你从拆分输入中休息一下
    • 您开始拆分copy 所以 strtok 再次记下,从而破坏之前的信息
  • 此时strtok只知道copy业务,对原始input一无所知。

主要问题是 strtok 不知道您同时在做两件事。从它的角度来看,您只是在完成第一个字符串之前开始处理不同的字符串。


可能的解决方案:

  • 使用strtok_r如果你有的话。它不是标准 C(但它是标准 POSIX)。 r 代表可重入
  • 使用您自己的拆分函数(strchr/循环等)
  • 更改您的程序逻辑,这样您就不需要在使用 input 完成之前拆分 copy

关于最后一点:

  • 保留一个 char * 数组,并用 strtok 填充它,而不暂停拆分子标记。所以每个元素应该是一个不同的命令
  • 完成 ";" 拆分后,开始处理每个数组元素

关于c - strtok 只返回一个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8450456/

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