2013-08-09 2 views
-3

Если я ввешу строку Beckham12David, она покажет ошибку, как ожидалось, и попросит снова ввести строку. Если я вхожу Дэвид тогда он будет показывать ошибку, но если я вхожу Бэкхем он будет принимать строковоеНеожиданное поведение строк

код ниже:

int i=0; 
    char str[15]; 
    cout<<"\n\n Enter String(Only aplhabets)"; 
    gets(str); 
    a: 
    while (str[i]) 
     { 
      if (isalpha(str[i])) 
      { 
      } 
      else 
      { 
      cout<<"\n\nWrong String Entered!!!! Please Enter again"; 
      gets(str); 
      goto a; 
      } 
      i++; 
     } 
     getch(); 
    } 
+0

Включить все предупреждения и отладочную информацию во время компиляции (с помощью [GCC] (http://gcc.gnu.org/) скомпилировать с помощью 'g ++ -Wall -g') и узнать, как использовать отладчик (например,' gdb'). –

+5

sidebar: удалить 'gets()' из любого кода, который вы пишете. Это ужасная функция, которая настолько плоха, что она устарела и не долго для этого мира. – WhozCraig

+0

Кроме того, рассмотрите возможность использования в C++ 'std :: string' –

ответ

2

Давайте посмотрим на значения str в то время как ваш итерация:

str[15] = "Beckham12David"; 
       ^
       cursor 

Ошибка is_alpha не соответствует характеру '1'. Теперь вы тестируете "david". gets будет принимать входные данные от stdin и сохранить его в строку с символом в \0 терминации:

str[15] = "david*m12David"; // * as \0, sorry :(
       ^
       cursor 

Таким образом, курсор по-прежнему указывает на вредоносный числа! Однако, когда вы вводите "beckham", вы в конечном итоге с:

str[15] = "beckham*2David"; // * as \0, sorry :(
       ^
       cursor 

Таким образом while(str[i]) ложно, и программа завершает работу. Чтобы исправить это, вы должны установить i в нуль сразу после своей метки.

Еще лучше, если придерживаться C++ 11:

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

int main(){ 
    std::string str; 
    int (*isalpha)(int) = std::isalpha;// necessary as std::isalpha is overloaded 
    for(;;){ 
     std::getline(std::cin, str);  
     if(std::all_of(str.begin(), str.end(), isalpha)){ 
     break; 
     } else { 
     std::cout << "Please enter only letters\n"; 
     } 
    } 
    } 
+0

ошибка в том же сеансе. Как и их r 5 алфавитов, а затем числовое число, поэтому, когда он снова просит ввести i нужно ввести хотя бы 5-буквенное слово. Пример: я вступил в United1Kingdom ... он попросит снова ввести .... если я вхожу только в kim, он снова попросит ввести, тогда как если я войду в Mercedes, он не покажет ошибку – tut

+0

Спасибо Zeta .... может у, пожалуйста, скажите мне способ решить эту ошибку. – tut

+0

Спасибо, я так много ..... я заменил «while (str [i])» с for (i = 0; str [i]; i ++), и это сработало ... теперь я знаю свою ошибку, благодарю вас так много :) – tut

0

вы пробовали?

cin >> str; 
cin.ignore(); // if entered more than 15 chars 

Или попробовать getline

+0

Это может быть полезным комментарием, но это не ответ на вопрос. – hvd

+0

Я знаю ... но у меня нет достаточного количества баллов для комментариев :(Но я думал, что это может помочь – Martin

0

это происходит делая различные входы на той же сессии отладки или каждого входа на другой сеанс отладки? если он находится на разных трассах .. чем это странно .. сделайте, если это все на одной сессии. Возможно, это из-за ошибки. вы не сбрасываете i после ввода другой строки. корректный код должен быть

int i=0; 
char str[15]; 
cout<<"\n\n Enter String(Only aplhabets)"; 
gets(str); 
a: 
while (str[i]) 
    { 
     if (isalpha(str[i])) 
     { 
     } 
     else 
     { 
     cout<<"\n\nWrong String Entered!!!! Please Enter again"; 
     gets(str); 
     i=0; 
     goto a; 
     } 
     i++; 
    } 
    getch(); 

Обратите внимание на i=0 так перезапуске анализируя новую строку с самого начала ..

0
  1. Вы использовали пробелы? Например: david_, где _ пробел? isalpha для пробела возвращает false.

  2. Старайтесь избегать инструкций по прыжкам - goto - в будущем.

Удачи!

+0

Нет, я не использую пространство ..... я исправил свою ошибку .... мне нужно для инициализации i = 0 каждый раз, когда я принимаю строку – tut

Смежные вопросы