2015-10-15 2 views
1

Задача cin>>...., принимать только буквы, менять буквы верхнего регистра на нижний регистр и переписывать строки только строчными буквами. Я не могу понять, почему мой код игнорирует введенную первую букву.Первый символ, опущенный простой программой

#include <iostream> 
#include <cctype> 
using namespace std; 

int main() 
{ 
    char ch; 
    cin >> ch; 
    while (ch != '@'){ 
     if (cin.get(ch)) 
     { 
      if (isalpha(ch)){ 
       if (isupper(ch)){ 
        cout <<(char)tolower(ch); 

       } 
       else 
        cout << ch; 
      } 
      if (ch == '\n') 
       cout << "\nNie zakonczyles ciagu znakiem @" << endl; 

     } 
     else{ 
      cin.clear(); 
     } 

    } 
} 

ответ

3

Поскольку цикл использует cin.get(ch), чтобы получить символ для печати, но первый символ на самом деле читать с cin >> ch; и затем результат отбрасывается.

Вы можете избавиться от cin>>ch; инструкции и инициализировать ch значение, отличающееся от '@', или преобразовать петлю в do-while петлю, похожее на это:

char ch; 
do 
{ 
    if (cin.get(ch)) 
    { 
     /* Do what is needed */ 
    } 
} 
while (ch != '@') 
2

Потому что только после того, как cin >> ch; вы делаете cin.get(ch).

3
cin >> ch; <- read first letter 
while (ch != '@'){ 
    if (cin.get(ch)) <- read next letter which tosses out the first letter 

Чтобы исправить это установить ch до некоторого значения, а затем избавиться от cin >> ch;