入门级<iostream>地狱(p)</iostream>

时间:2012-01-10 15:31:09

标签: c++ iostream

我在使用此代码时遇到了一些麻烦。我正在尝试编写一个函数,允许用户输入一个字符串(多个单词),然后返回第一个单词。使用Python但C ++的一个简单任务再次让我感到困惑。我在那里的一部分,并意识到我仍然需要添加第一个令牌的实现,但在增量调试中我遇到了一些障碍。我追求的问题是:

  1. 为什么,当我输入整数时,该功能是否会在控制台上打印出来?不应该输入int会导致cin流失败,从而重新引导用户进行另一次输入?
  2. 如何在返回之前让窗口暂停(可能等待用户“输入”)?它打印和返回的速度很快,很难看出它的作用。
  3. 以下是代码:

    /*
    * Problem 1: "Extract First String"
    * Takes a user string and extracts first token (first token can be a whole word)
    */
    
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    void ExtractFirstToken();
    
    int main()
    {
        ExtractFirstToken();
        return 0;
    }
    
    /*
    * Trying to create a function that will allow a user to enter a string of words and
    * then return the first word
    */
    void ExtractFirstToken()
    {
        cout << "Please enter a string (can be multiple words): ";
        string stringIn;
        while (true)
        {
            cin >> stringIn;
            if (!cin.fail()) break;
            cin.clear();
            cout << "not a string, please try again: ";
        }
        cout << stringIn;
    }
    

5 个答案:

答案 0 :(得分:1)

1)否。数字作为字符串完全有效。

首先根据您的定义编写一个确定字符串是否为单词的函数。像这样:

bool IsWord(const std::string & str)
{
    return str.find_first_of("0123456789 \t\n") == std::string::npos;
}

然后:

std::string word;
while(std::cin >> word)
{
    if (IsWord(word)) break;
    cout << "not a word, please try again: ";

}
std::cout << word;

2)只需从命令行运行程序即可。

答案 1 :(得分:1)

  1. 因为字符串完全能够保存“12345”。为什么会失败?

  2. 我会说std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); 之类的东西(嘿,有趣的是我的回答与Benjamin Lindley完全一样,直到使用numeric_limits和streamize)

  3. 这将等待输入,直到您按Enter键。

答案 2 :(得分:0)

这是标准的格式化I / O习语:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::string line;

    std::cout << "Please enter some text: ";
    while (std::getline(std::cin, line))
    {
        std::istringstream iss(line); 
        std::string word;

        if (iss >> word)
        {
            std::cout << "You said, '" << line << "'. The first word is '" << word << "'.\n";
            std::cout << "Please enter some more text, or Ctrl-D to quit: ";
        }
        else
        {
             // error, skipping
        }
    }
}

除了通过到达输入流的末尾而不能读取字符串,用户必须用Ctrl-D或类似的信号(MS-DOS上的Ctrl-Z)发送信号。您可以添加另一个中断条件,例如如果修剪后的输入字符串等于"q"左右。

内部循环使用字符串流来标记该行。通常你会处理每个令牌(例如转换为数字?),但在这里我们只需要一个,即第一个单词。

答案 3 :(得分:0)

所有可打印字符都是有效的字符串元素,包括数字。因此,如果您希望将数字解释为无效输入,则您必须自己完成工作。例如:

if (stringIn.find_first_of("0123456789") != stringIn.npos)
    cout << "not a valid string, please try again: ";

答案 4 :(得分:0)

第一部分你有很多答案,所以我会帮助第二部分:

system("pause");