gpt4 book ai didi

c - strtok 没有遍历所有标记

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:43 24 4
gpt4 key购买 nike

我正在尝试将 shell 实现为学校作业的一部分,但我被困在文件输入/输出重定向部分。

更具体地说,我想出了一个函数,它允许我检测输入的命令是否指定了“>”或“<”,甚至是“|”。

理想情况下,如果我输入 ls -a > ls.tx',那么标记 ls -als.txt 应该是返回。

我的代码不这样做,它只返回 ls -a 然后停止。

我的代码如下:

/*commandLine is a char* taken in from the user, and is a null-terminated string */
int counter = 0;
parsedLine = strtok(commandLine, ">");
while (parsedLine != NULL)
{
if (counter == 0)
{
strncpy(parsedCpy, parsedLine, strlen(parsedLine));
parseCommand(parsedCpy, commands);
counter++;
}
else
{
redirect->re_stdout = parsedLine;
}
parsedLine = strtok(NULL, ">");
}

我已经在另一个测试文件中尝试过它只是为了看看是否有问题,但是这个测试文件(下面的代码)返回了预期的结果(即 ls -als.txt)

    char myString[] = "ls -a > ls.txt";
char* parsed;

parsed = strtok(myString, ">");
while (parsed != NULL)
{
printf("%s\n", parsed);
parsed = strtok(NULL, ">");
}

有什么我不明白的地方吗?我真的看不出哪里出错了,因为代码本身在这两种情况下几乎相同。

最佳答案

请注意,strncpy 不会以零终止字符串,除非零终止是正在复制的源代码的一部分。参见 man strncpy。它说:

Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.

根据 parseCommand 的作用,这可能会引发其他问题。

在这种情况下,您应该只执行一个strcpy。如果您给 strncpy 一个源字符串的长度,它实际上不会为您做任何事情,除非您有意尝试避免复制空终止符。所以你应该使用,strcpy(parsedCpy, parsedLine);

关于c - strtok 没有遍历所有标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533972/

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