1

我想输入一个短语并提取短语的每个字符:

int main()
{
    int i = 0;
    string line, command;
    getline(cin, line); //gets the phrase ex: hi my name is andy
    stringstream lineStream(line);
    lineStream>>command;
    while (command[i]!=" ") //while the character isn't a whitespace
    {
        cout << command[i]; //print out each character
        i++;
    }
}

但是我得到了错误:不能在while语句中比较指针和整数

4

2 回答 2

3

正如您的标题“使用字符串流提取参数”所暗示的那样:

我想你正在寻找这个:

getline(cin, line); 
stringstream lineStream(line);

std::vector<std::string> commands; //Can use a vector to store the words

while (lineStream>>command) 
{
    std::cout <<command<<std::endl; 
   //commands.push_back(command); // Push the words in vector for later use
}
于 2013-09-22T18:45:23.300 回答
0

command是字符串,command[i]字符也是。您不能将字符与字符串文字进行比较,但可以将它们与字符文字进行比较,例如

command[i]!=' '

但是,您不会在字符串中获得空格,因为输入运算符>>会读取空格分隔的“单词”。所以你有未定义的行为,因为循环将继续超出字符串的范围。

您可能需要两个循环,一个从字符串流外部读取,一个内部循环从当前单词中获取字符。要么这样,要么在字符串中循环line(我不建议这样做,因为空格字符不仅仅是空格)。或者当然,由于来自字符串流的“输入”已经是空格分隔的,只需打印字符串,无需遍历字符。


要从字符串流中提取所有单词并放入字符串向量中,可以使用以下命令:

std::istringstream is(line);
std::vector<std::string> command_and_args;

std::copy(std::istream_iterator<std::string>(is),
          std::istream_iterator<std::string>(),
          std::back_inserter(command_and_args));

在上面的代码之后,向量command_and_args包含来自字符串流的所有空格分隔的单词,command_and_args[0]即命令。

参考资料:std::istream_iterator, std::back_inserter, std::copy.

于 2013-09-22T18:37:37.473 回答