【发布时间】:2014-02-03 17:43:45
【问题描述】:
我正在尝试实现一个 shell 作为学校作业的一部分,但我被困在文件输入/输出重定向部分。
更具体地说,我想出了一个函数,它可以让我检测输入的命令是否指定了“>”或“
理想情况下,如果我输入ls -a > ls.tx',则应返回标记ls -a 和ls.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 -a 和ls.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。它说:警告:如果 src 的前 n 个字节中没有空字节,则放置在 dest 中的字符串将不会以空值结尾。这可能会导致其他问题,具体取决于 @987654332 @ 会。 -
您的问题出在其他地方。这是一个可以正常工作的修改版本:ideone.com/WLfQER
-
你应该只做一个
strcpy。如果您给它提供源字符串的长度,strncpy并没有真正为您做任何事情,除非您有意避免复制空终止符。strcpy(parsedCpy, parsedLine); -
@mbratch - 你的 cmets 值得回答。