2014-11-18 3 views
-2

Таким образом, цель функции isalpha заключается в том, что она принимает только буквы (a-z), но это не похоже на мой код. Если я введу букву p, появится сообщение об ошибке. Если ввести слово типа «город», сообщение об ошибке все еще отображается. Что не так с моим кодом.Функция IsAlpha не принимает мой ввод

Так что из-за использования cin вместо cin.getline, второй фрагмент кода работает, но первый из них постоянно обходит сообщение об ошибке независимо от того, что. Может кто-нибудь объяснить?

Note1: Если вы думаете, что я должен использовать оператор cin вместо cin.getline, тогда это создаст новую проблему. Понимаете, эта программа является частью другой программы, и в этой программе все мои входные потоки (>>) были cin.getline. Итак, если я использую как cin, так и cin.getline, это создаст конфликт. Я пытался использовать cin.ignore, но безрезультатно. Несмотря на это, я до сих пор не знаю, почему это происходит.

#include <iostream> 
#include <string> 
#include <cctype> 

using namespace std; 

int main() 
{ 
const int SIZE = 10; 
char letter[SIZE]; 

cout << "Enter a word. "; 
cin.getline(letter, SIZE, '\n'); 

while(!isalpha(letter[SIZE])) 
{ 
    cerr << "Error, only letters are allowed. "; 
    cin.getline(letter, SIZE, '\n'); 
} 

cout << "This is acceptable. "; 

return 0; 
} 


#include <iostream> 
#include <string> 
#include <cctype> 

using namespace std; 

int main() 
{ 
const int SIZE = 10; 
char letter[SIZE]; 

cout << "Enter a word. "; 
cin >> letter[SIZE]; 

while(!isalpha(letter[SIZE])) 
{ 
    cerr << "Error, only letters are allowed. "; 
    cin >> letter[SIZE]; 
} 

cout << "This is acceptable. "; 

return 0; 
} 
+4

Я не уверен, что 'письмо [SIZE]' делает то, что вы думаете. – chris

+0

Хорошо, почему он работает для cin, но не cin.getline? Это все, что я хочу знать. – Deathslice

+0

'cin >> letter [SIZE];' undefined behavior. 'cin.getline (буква, SIZE, '\ n');' is not. Условие, следующее за ними, - это неопределенное поведение, так что ни на самом деле не работает. – chris

ответ

0

Это потому, что буква [SIZE] считается указателем, указывающим на первый элемент вашего массива. Таким образом, ваше время (! Isalpha (letter [SIZE])) проверяет только, является ли первый символ буквенно-цифровым или нет.

Вот пример лучшего понимания;

Попробуйте распечатать письмо [SIZE] на экране.

int main() 
{ 
const int SIZE = 10; 
char letter[SIZE]; 

cout << "Enter a word. "; 
cin >> letter[SIZE]; 

cout << letter[SIZE] // this will only output the first character that the user entered. 

cout << "This is acceptable. "; 

return 0; 
} 

поэтому, если вы хотите проверить все введенное слово, вам нужно будет прокрутить элемент за элементом.

+0

Вижу, спасибо за ответ. – Deathslice