Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с cin.get()


Автор: Hawaii 31.7.2007, 01:11
Пытаюсь ввести две строки через cin.get(). Первая строка вводится, а вторая нет. В чем проблема?
Программа сравнивает две строки (моя версия strcmp(str1, str2)... )

Код

#include <iostream>
using namespace std;
int compstr(char* s1, char* s2)
{
    int Longest;
    int leS1 = strlen(s1);
    int leS2 = strlen(s2);
    if (leS1 > leS2) {Longest = leS1;}
    if (leS1 < leS2) {Longest = leS2;}
    if (leS1 == leS2) {Longest = leS2;}
if(*s1 < *s2) {return -1;} // Сравнение по первому символу
if(*s1 > *s2) {return 1;}  // Сравнение по первому символу
if(*s1 == *s2)  // Если первые символы равны,
  {
  for (int j=0; j<Longest; j++)
     {
     *s1++; s2++;     // Сравниваем следующие
     if(*s1 < *s2) {return -1;} // Сравнение следующих символов
     if(*s1 > *s2) {return 1;}  // Тоже самое
     // Если все символы равны, то и строки равны, следов.
     } 
  return 0;  //  возвращаем 0.
  }

}
int main()
{
    const int MAX = 80;
    char str1[MAX];
    char str2[MAX];
    int number;
    cout << "Enter string(1): "; cin.get (str1, MAX);    
    
    cout << "Enter string(2): "; cin.get (str2, MAX);

    number = compstr(str1, str2);
    if (number>0) {cout << "string(2) идет первой по алфавиту ";}
    if (number==0) {cout << "string(2) равна string(1) ";}
    if (number<0) {cout << "string(2) идет позже по алфавиту ";}
    
    system("PAUSE");
    return 0;    
}

Автор: JackYF 31.7.2007, 02:03
Цитата(Hawaii @  31.7.2007,  01:11 Найти цитируемый пост)
моя версия strcmp(str1, str2)...

Извини, но никакой критики по производительности не выдерживает. Хорошая функция как минимум не должна вызывать strlen и иметь так много ветвлений. Кроме того, функция сравнения должна принимать аргументы типа const char*.


Цитата(Hawaii @  31.7.2007,  01:11 Найти цитируемый пост)
две строки через cin.get().

юзай cin.getline()

и в случае чего, после ввода первой строки cin.sync(), хотя не должно понадобиться.

Автор: Kuvaldis 31.7.2007, 02:20
Hawaii, 
Проблема в том, что метод get() работает и принимает символы до того момента, пока не встретит символ окончания (по умолчанию "ввод") Все что до ВВОДА, заносится в буфер, но сам символ \n из очереди клавы НЕ УБИРАЕТСЯ
Выход: между вызовами cin.get() поставить cin.ignore(), чтобы выкинуть ненужный символ и вводить новую строку 
P.S. Это при условии, что ты вводишь строки через нажатие ВВОДА
А вообще, правильно сказал JackYF: юзай getline()

Добавлено через 38 секунд
Код

cin.get(s1, 10);
cin.ignore();
cin.get(s2, 10);

Автор: NoNo 31.7.2007, 14:43
разберись с потоками....


Автор: Predator_2004 3.8.2007, 11:59
Попробуй так:
Код

char str[256];
gets(str);

Автор: Rockie 3.8.2007, 12:21
Лучше http://msdn2.microsoft.com/en-us/library/5b5x9wc7(VS.80).aspx


Автор: Mayk 3.8.2007, 19:12
Цитата(Rockie @  3.8.2007,  16:21 Найти цитируемый пост)
Лучше gets_s

Строго говоря её нет в стандартах. В си есть fgets(); 

Цитата(JackYF @  31.7.2007,  06:03 Найти цитируемый пост)

юзай cin.getline()

ИМХО getline(cin, str)  удобнее cin.getline(buf,bufsize) 

Автор: Dronchik 5.8.2007, 12:40
И ещё. С какого ... консоль выведет русские буквы. Нужно выставить локаль или плоьзоваться функцией CharToOem.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)