Начальный уровень <iostream>ад (р) - PullRequest
0 голосов
/ 10 января 2012

У меня проблемы с этим кодом.Я пытаюсь написать функцию, которая позволяет пользователю вводить строку (из нескольких слов), а затем возвращает 1-е слово.Простая задача с Python, но C ++ снова сбивает меня с толку.Я отчасти и понимаю, что мне все еще нужно добавить реализацию для первого токена, но в добавочной отладке я столкнулся с некоторыми трудностями.Я задаю следующие вопросы:

  1. Почему при вводе целых чисел функция выводит их на консоль?Не должны ли вводы ints вызывать сбой потока cin и, следовательно, повторять запрос пользователя на другую запись?
  2. Как я могу заставить окно приостановиться (возможно, ожидая ввода от пользователя) перед возвратом?Он печатает и возвращает так быстро, что трудно понять, что он делает.

Вот код:

/*
* 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 ]

1 голос
/ 10 января 2012

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 голос
/ 10 января 2012
  1. потому что строка вполне может содержать «12345». Почему бы это не удалось?

  2. Я бы сказал что-то вроде std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); (хех, забавно, что мой ответ точно такой же, как у Бенджамина Линдли, вплоть до использования numeric_limits и streamsize)

Это будет ждать ввода, пока вы не нажмете ввод.

0 голосов
/ 10 января 2012

Вы получили много ответов на первую часть, поэтому я помогу со второй:

system("pause");
0 голосов
/ 10 января 2012

Все печатные символы являются допустимыми строковыми элементами, включая цифры. Поэтому, если вы хотите, чтобы цифры интерпретировались как неверный ввод, вам придется выполнить работу самостоятельно. Например:

if (stringIn.find_first_of("0123456789") != stringIn.npos)
    cout << "not a valid string, please try again: ";
0 голосов
/ 10 января 2012

Вот стандартная идиома ввода / вывода:

#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 иличто-то подобное (Ctrl-Z в MS-DOS).Вы можете добавить еще одно условие разрыва, например, если усеченная входная строка в нижнем регистре равна "q" или около того.

Внутренний цикл использует поток строк для токенизации строки.Обычно вы обрабатываете каждый токен (например, конвертируете в числа?), Но здесь нам нужен только один, а именно первое слово.

...