2016-04-04 104 views
0

我有我的地方,我無法獲得if (sequence[i]!='M' && sequence[i]!='U' && sequence[i]!='I')作品的以下功能麻煩..程序沒有執行內容正確

基本上,我計劃在此過程中的工作 -

  1. 輸入在輸入
  2. 輸入在字符序列的大小,其中字符只能是M,U或I

例如。如果我輸入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

你可能想在這裏用'之開關聲明而不是一個錯綜複雜的'&&'操作鏈。 – 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指針的副本,讓你還有一個指向字符串的開頭,當你與計數做while循環:

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