2016-04-04 5 views
0

у меня возникли проблемы со следующей функцией шахты, где я не смог получить if (sequence[i]!='M' && sequence[i]!='U' && sequence[i]!='I') работы ..Программа не выполняется содержание правильно

В основном, мои программы работы в этой процедуре -

  1. Введите в размере входа
  2. Ввод в последовательности символов, где символы могут быть только М, U или я

Например. Если я вхожу в 3 в качестве моего размера ввода, а затем MUUI, он будет печататься как недопустимый ввод и запрашивать новый ввод, пока не будет введено что-то вроде MUI.

Однако, если я вхожу в 3 как мой размер входного, а затем MPO как последовательность символов, программа будет продолжать работать линию if (sequence[i]!='M' && sequence[i]!='U' && sequence[i]!='I'), даже если это не так.

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

Могу ли я делать это не так-то?

int main(){ 
int sz; 
cout<<"Enter in size of input: "; 
cin>>sz; 
char *sequence = new char[sz]; 
cout<<"Enter MU character sequence(M/U/I): "; 
cin>>sequence; 

bool checkMUI =isMUString(sequence, sz); 
while(checkMUI== false){ 
    cout<<"INVALID INPUT. RE-Enter MU character sequence(M/U/I): "; 
    cin>>sequence; 
    checkMUI =isMUString(sequence, sz); 
} 

bool isMUString(char* sequence, int size){ 

    int numberOfChars = 0; 
    while (*sequence != '\0') 
    { 
     numberOfChars++; sequence++; 
    } 

    for(int i=0;i<size;i++){ 
     if (numberOfChars != size){ 
      if (sequence[i]!='M' && sequence[i]!='U' && sequence[i]!='I'){ 
       return false; 
      } 
     } 
    } 
    return true; 
+0

Вы можете использовать 'switch' заявление здесь вместо свернутой цепочки операций '&&'. – tadman

+1

Также почему вы переписываете 'strlen'? Это действительно запутывает то, что вы здесь делаете, а также неясно, почему это помечено C++, когда все это C-код. – tadman

+1

Также в момент, когда вы начинаете с цикла for, 'sequence' уже указывает на конец строки. – tonisuter

ответ

1

Я думаю, что это то, что вы хотите:

bool isMUString (char* sequence, int size) 
{ 

    int numberOfChars = 0; 
    while (sequence[numberOfChars] != '\0') 
    { 
     numberOfChars++; 
    } 

    if (numberOfChars != size) 
    { 
     return false; 
    } 

    for (int i = 0; i < size; i++) 
    { 
     if (sequence[i] != 'M' && sequence[i] != 'U' && sequence[i] != 'I') 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

Просто попробовал, и он не работает :(Предположим, что мой первый вход неверен, например.MPO, то я снова включаюсь в качестве MUI, он, кажется, возвращается как false, я говорю это, потому что в моей основной функции есть эта строка 'bool checkMUI = isMUString (sequence, sz); while (checkMUI == false) ', и он продолжает просить меня повторно ввести – dissidia

+0

Показывать полную' main() 'функцию в тексте вопроса. –

+0

Я только что включил в часть, используемую только в функции main() – dissidia

2

Это должно работать:

bool isMUString(const char* sequence, int size) { 
    int numberOfChars = strlen(sequence); 
    if(numberOfChars != size) { 
     return false; 
    } 

    for(int i=0;i<size;i++){ 
     if (sequence[i]!='M' && sequence[i]!='U' && sequence[i]!='I'){ 
      return false; 
     } 
    } 
    return true; 
} 

Вот что я изменил:

  • Использование StrLen для определения длины строки
  • Возьмите if(numberOfChars != size) из корпуса цикла for, потому что его нужно только один раз проверить.

Вот пример, если вы не хотите использовать strlen() (все, что вам нужно). Я делаю копию sequence указателя, так что у вас еще есть указатель на начало строки, когда вы закончите с подсчетом в то время как цикл:

bool isMUString(const char* sequence, int size) { 
    int numberOfChars = 0; 
    const char* ptr = sequence; 
    while (*ptr != '\0') { 
     numberOfChars++; ptr++; 
    } 

    if(numberOfChars != size) { 
     return false; 
    } 

    for(int i=0;i<size;i++){ 
     if (sequence[i]!='M' && sequence[i]!='U' && sequence[i]!='I'){ 
      return false; 
     } 
    } 
    return true; 
} 
+0

Кажется, что в моей работе, к сожалению, мне еще предстоит изучить 'strlen' или что-то вроде' #include 'или' #include 'Просто интересно, есть ли что-нибудь, что я могу изменить из своего текущего кода? – dissidia

+1

'strlen()' - функция, которая подсчитывает символы в строке. – tonisuter

+0

А теперь я понимаю ваш вопрос. Если вы не хотите использовать 'strlen', вы должны сделать копию' sequence' ptr и использовать это для подсчета. В противном случае у вас больше нет указателя на начало строки. Я обновил свое решение. – tonisuter

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