Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2011, 07:21   #1
SHoooo
Новичок
Джуниор
 
Регистрация: 02.05.2011
Сообщений: 5
По умолчанию Считать n строк

Приветствую. Такая проблема: нужно считать н строк подряд(строки с пробелами). Тк строки с пробелами я так понимаю cin не подойдет.
Пробовал getlineом но у меня почему-то одна строка считывается а дальше даже символы не печатает.Препод сказал что это из-за какой-то хрени с переносом строки кажется.Вобщем он дописал вызов процедуры и все заработало.
Но это какой-то бородатый метод, тем более он так и не объяснил почему заработало. Вобщем мне нужен универсальный метод считывания строк с пробелами. Проблема возникла при написании С4 из ЕГЭ, программу написал а считывание не работает.
Спасибо.
SHoooo вне форума Ответить с цитированием
Старый 02.05.2011, 07:23   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Приложение консольное?
Если Да, тогда так:

if(S[i] == '\n' || S[i] == '\h' || S[i] == '\0') k++;
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 02.05.2011 в 07:32.
Smitt&Wesson вне форума Ответить с цитированием
Старый 02.05.2011, 08:16   #3
SHoooo
Новичок
Джуниор
 
Регистрация: 02.05.2011
Сообщений: 5
По умолчанию

Что такое k?
Я если честно ничего не понял, ну проверяем мы каждый символ на конец строки и еще на неизвестный мне '\h'. И что дальше?
К какой строке мы обращаемся тоже не ясно, тк у меня не получатеся именно считать. Наверно я зря написал про перенос строки (:
У меня не получается считать несколько строк. Выглядеть это должно примерно так.
string str;

for (i = 0; i < n; ++i){
//считываем в str
//нахожу в строке то что нужно
}
Вот именно считывание я и не знаю как сделать.
И да, приложение консольное.
SHoooo вне форума Ответить с цитированием
Старый 02.05.2011, 11:58   #4
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

SHoooo
Цитата:
Вот именно считывание я и не знаю как сделать.
Код:
#include<iostream>
#include<string>
using namespace std;

int main() {
	string a;
	getline(cin, a);
	cout<<a;
	cin.get();
	return 0;
}
the_deer_one вне форума Ответить с цитированием
Старый 02.05.2011, 13:03   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Думаю, в качестве примера вам будет полезен следующий код, который взят без изменения из книги Кернигана и Ритчи. Я только добавил "getchar();" для задержки и просмотра результата работы программы. И ещё я комментарии по-другому расположил.

Чтобы ввести EOF (End of File) в терминал Windows, нужно нажать "Ctrl+Z+<Enter>".
Код:
////////////////////////////////////////////////////////////////
// Файл LongestLine.cpp - вывод самой длинной строки в потоке //
// стр. 42 из книги Кернигана и Ритчи, изд. второе, 2009 г.   //
////////////////////////////////////////////////////////////////

#include <stdio.h>

// Максимальная длина строки в потоке
#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

// Вывод самой длинной строки в потоке
int main() {
   // Длина текущей строки
   int len;

   // Текущая максимальная строка
   int max;

   // Текущая введёная строка
   char line[MAXLINE];

   // Самая длинная строка из введённых
   char longest[MAXLINE];

   max = 0;
   while ((len = getline(line,MAXLINE)) > 0) {
      if (len > max) {
         max = len;
         copy(longest, line);
      }
   }
   // Была не пустая строка
   if (max > 0) {
      printf("%s", longest);
   }
   getchar();
   return 0;
}

// getline: считывает строку в s, возвращает её длину
int getline(char s[], int lim) {
   int c, i;

   for (i = 0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) {
      s[i] = c;
   }
   if (c == '\n') {
      s[i] = c;
      ++i;
   }
   s[i] = '\0';
   return i;
}

// copy: копирует строку 'from' в 'to'; длина to считается достаточной
void copy(char to[], char from[]) {
   int i;

   i = 0;
   while ((to[i] = from[i]) != '\0') {
      ++i;
   }
}

Последний раз редактировалось 8Observer8; 02.05.2011 в 13:05. Причина: Выравнивание.
8Observer8 вне форума Ответить с цитированием
Старый 02.05.2011, 15:21   #6
SHoooo
Новичок
Джуниор
 
Регистрация: 02.05.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от the_deer_one Посмотреть сообщение
SHoooo

Код:
#include<iostream>
#include<string>
using namespace std;

int main() {
	string a;
	getline(cin, a);
	cout<<a;
	cin.get();
	return 0;
}
У меня было примерно то же, но оно не работало (:
Почему этот код работает некорректно?
#include<iostream>
#include<string>
using namespace std;

int main() {
string a;
int n;
cin >> n;
for (int i = 0; i < n; ++i){
getline(cin, a);
}
system("pause");
return 0;
}
Считывание происходит n-1 раз, на первой итерации getline не срабатывает.
SHoooo вне форума Ответить с цитированием
Старый 02.05.2011, 17:28   #7
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

SHoooo
Цитата:
Считывание происходит n-1 раз, на первой итерации getline не срабатывает.
Код:
#include<iostream>
#include<string>
using namespace std;

int main() {
 string a;
 int n;
 cin >> n;
 cin.ignore(cin.rdbuf()->in_avail());

 for (int i = 0; i < n; ++i){
 getline(cin, a);
 cout<<i<<" "<<"\""<<a<<"\""<<endl;
}

 system("pause");
 return 0;	
}
the_deer_one вне форума Ответить с цитированием
Старый 03.05.2011, 07:45   #8
SHoooo
Новичок
Джуниор
 
Регистрация: 02.05.2011
Сообщений: 5
По умолчанию

Что это?
cin.ignore(cin.rdbuf()->in_avail());
И это
cout<<i<<" "<<"\""<<a<<"\""<<endl;
Спасибо за ответы, но какой от них толк если я так и не понял в чем проблема, и почему предложенные вами варианты работают?
Получается только трата моего и вашего времени (:
SHoooo вне форума Ответить с цитированием
Старый 03.05.2011, 14:54   #9
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Цитата:
Что это?
cin.ignore(cin.rdbuf()->in_avail());
Чё-то в cin остаётся. Метод ignore игнорирует символы.
А rdbuf->in_avail() возвращает количество сиволов которые есть в потоке.
Короче cin.ignore(cin.rdbuf()->in_avail()) очищает поток cin.

Цитата:
И это
cout<<i<<" "<<"\""<<a<<"\""<<endl;
А здесь в cout отправляется строка состоящая из номера, и введённой пользователем строки в кавычках.
the_deer_one вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать автозаполнение строк, которые зависят от строк другого столбца путвфда_иил Microsoft Office Excel 19 29.08.2010 17:16
перенос строк удаление ненужных строк HelperAwM Microsoft Office Excel 5 26.06.2010 18:42
Добавление строк в таблицу с вставкой в них текста и чередованием фона строк Centurion2xx6 Microsoft Office Word 9 30.03.2010 11:00
Матрица A состоит из 8 строк и 6 столбцов. вычесть из всех её строк, начиная со второй, первую строку Dimak24 Помощь студентам 1 19.12.2008 15:45
Excel max 256 строк VS user надо 300 строк Exo Microsoft Office Excel 3 10.01.2008 17:14