1

可以这么说,我目前正在编写一个命令行“解析器”,到目前为止它一直在工作,直到我尝试了几种添加选项/参数的方法。

void parser::nextCom() {

    cout << parser::prompt; // parser::prompt = "> "
    string com;
    getline(cin, com);

    char the_command[5]; //  i want this to store the command e.g. "go" given that go is a command
    for (int i = 0; i < com.size(); i++) {
        if (com[i] == ' ') break;
        else the_command[i] = com[i];
    }

    cout << the_command << endl;
}

the_command该命令已复制,但在打印到控制台时会显示一些非常不需要的字符。

如果我将“向北”作为命令传递,这就是我得到的:

goÌÌÌÌÌÌÌÌÌÌÌÌÌÌØNi

我不太确定 C++ 中的 char 数组,但我不知道我是如何得到这个输出的。任何帮助都将不胜感激。有关代码的任何问题,或者如果您需要更多我的代码,请发表评论,在此先感谢

4

5 回答 5

4
cout << the_command << endl;

当您打印这样的char数组时,会继续插入字符,直到\0在字符串中找到空字符。

在开始将字符从 复制com到之前the_command,该数组完全未初始化。我将用问号表示这些未知字符(当然,它们实际上可能不是问号):

? ? ? ? ?

这意味着您不知道char数组中 s 的值是什么。然后,您只复制字符gofrom the_commandinto com,因此您的数组现在包含:

g o ? ? ?

因此,当您尝试输出此数组时,输出流不知道何时停止。您需要确保\0o. 一种方法是:

for (int i = 0; i < com.size(); i++) {
    if (com[i] == ' ') {
      the_command[i] = '\0';
      break;
    }
    else the_command[i] = com[i];
}

这将使数组像这样:

g o \0 ? ?

但是,您最好坚持使用std::string. 我不想去想你在使用这个数组时会遇到的问题,而这些问题是可以避免的。这是我编写函数的方式:

void parser::nextCom() {
    std::cout << parser::prompt;

    std::string command_line, command;
    std::getline(cin, command_line);

    std::stringstream command_line_stream(command_line);
    command_line_stream >> command;

    if (command == "go") {
      std::string direction;
      command_line_stream >> direction;
      go(direction);
    }
}
于 2013-03-21T20:19:33.377 回答
3

the_command读取最后一个字符后,您不会以空值终止。或进行任何边界检查。

std::string改用。

于 2013-03-21T20:18:09.523 回答
3

将代码更改为:

if (com[i] == ' ')
{
   com[i] = '\0';
   break;
}

这将确保您的 char 数组末尾有一个空终止符。您看到垃圾的原因是因为std::cout会愉快地打印字符,直到它看到一个空终止符。

于 2013-03-21T20:18:25.787 回答
1

这是因为您的代码中有缓冲区溢出。您将不确定长度的字符串复制到 char[5] 缓冲区中...基本上,您的循环将输入字符串确定的字节数复制到 char[5] 数组的末尾,该数组不再以 null 结尾,所以“cout”只是读取,直到找到空字节。

于 2013-03-21T20:15:21.097 回答
1

基本上the_command[5]包含垃圾,因为未初始化且不包含字符终止符。你可以先清除它,你会没事的

for (i = 0; i < 5; i++)  {
    the_command[i] = 0; 
}
于 2013-03-21T20:18:59.447 回答