Чтение строки с целыми числами и строки с пробелами - PullRequest
5 голосов
/ 19 ноября 2011

У меня есть формат ввода:

целое число, состоящее из нескольких слов, целое число

Однако я знаю максимальную длину строки из нескольких слов.Я не знаю, сколько слов в нем содержится.Как я могу это прочитать?

Ответы [ 3 ]

5 голосов
/ 19 ноября 2011

Я бы сначала прочитал строку и преобразовал первое и последнее слово в целые числа.Свободно:

std::string line;
std::getline(infile, line);

size_t ofs_front = line.find(' ');
size_t ofs_back = line.rfind(' ');

int front = std::strtol(line.substr(0, ofs_front).c_str(), NULL, 0);
int back  = std::strtol(line.substr(ofs_back).c_str(), NULL, 0);
std::string text = line.substr(ofs_front, ofs_back - ofs_front);

Вам придется внести некоторые изменения, чтобы избавиться от пробелов (например, увеличить смещения, чтобы поглотить все пробелы), и вы должны добавить множество проверок ошибок.

Если вы хотите нормализовать все внутренние пробелы внутри текста, есть другое решение с использованием строковых потоков:

std::vector<std::string> tokens;
{
  std::istringstream iss(line);
  std::string token;
  while (iss >> token) tokens.push_back(token);
}
// process tokens.front() and tokens.back() for the integers, as above
std::string text = tokens[1];
for (std::size_t i = 2; i + 1 < tokens.size(); ++i) text += " " + tokens[i];
1 голос
/ 19 ноября 2011

Это не так эффективно, как решение @ KerrekSB , но другой способ сделать это - извлечь первое целое число, а затем перебрать оставшуюся часть строки, пока не найдете второе целое число.

#include <iostream>
#include <sstream>

int main()
{
  std::istringstream ss( "100 4 words to discard 200" );
  int first, second;
  char buf[1000] = {0};

  if( !( ss >> first ) ) {
    std::cout << "failed to read first int\n";
    return 1;
  }

  while( !( ss >> second ) || !ss.eof() ) {
    if( ss.eof() ) {
      std::cout << "failed to read second int\n";
      return 1;
    }
    ss.clear();

    if( ss.getline( buf, 1000, ' ' ).bad() ) {
      std::cout << "error extracting word\n";
      return 1;
    }
  }    

  std::cout << "first = " << first << "\n";
  std::cout << "second = " << second << "\n";

  return 0;
}
1 голос
/ 19 ноября 2011

Прочитайте первое целое число. Перейти к задней части строки и пропустить цифры. Затем прочитайте int с этой точки. Часть в середине - это строка. Может быть не на 100% правильно, но:

char buf[256], *t = buf, *p, str[256];
fread(buf, 1, 256, file);
int s,e;
t += sscanf(buf, "%d", &s);
*p = buf + strlen(buf);
while (isdigit(*p)) p--;
sscanf(p, "%d", &e);
strncpy(str, p, p - t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...