2017-01-11 10 views
2

私はユーザーが入力したメモを取り込み、配列に格納しようとしています。検証が正常に動作しますが、私の入力は、ループの最後の値は、私が取得するとき:デバッグアサーションが失敗しました。 BIG_ALLOCATION_ALLIGNMENT

Debug Assertion Failed! 
Expression: "(_Ptr_user & (_BIG_ALLOCATION_ALIGNMENT - 1))==0"&&0 
An invalid parameter was passed to a function that considers invalid parameters fatal. 

私は、問題がどこにあるかを理解するのに苦労し、どのように私はそれを修正することができますよ。

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

typedef string noteName; 

noteName getNoteName(int i) 
{ 
    bool flag = true; 
    noteName Namein; 

    do 
    { 
     cout << "Please enter note name no. " << i + 1 << ": "; 
     cin >> Namein; 
     cout << "------------------------------------\n"; 

     if (Namein.length() > 3 || Namein.length() < 2) 
     { 
      cout << "Sorry, a note name must be 2 or 3 characters long. Please try again.\n"; 
      flag = false; 
     } 
     else if (Namein.length() == 3 && Namein[1] != '#') 
     { 
      cout << "Sorry, the second character of a sharp note name must be #. Please try again.\n"; 
      flag = false; 
     } 
     else if ((Namein[0] < 'a' || Namein[0] > 'g') && (Namein[0] < 'A' || Namein[0] > 'G')) 
     { 
      cout << "Sorry, the first character of a note name must be a letter between A and G. Please try again.\n"; 
      flag = false; 
     } 
     else if (isdigit(Namein.back()) == false) 
     { 
      cout << "Sorry, the last character of a note name must be a number. Please try again.\n"; 
      flag = false; 
     } 
     else 
     { 
      flag = true; 
     } 
    } while (flag == false); 

    return Namein; 
} 

int main() 
{ 
    const int numNotes = 4; 

    noteName NoteNames[numNotes]; 

    cout << "Hello\n"; 

    for (int i = 0; i <= numNotes; i++) 
    { 
     NoteNames[i] = getNoteName(i); 
    } 

    cout << "Thank you, the note names and lengths you entered were: \n\n"; 

    for (int i = 0; i <= numNotes; i++) 
    { 
     cout << i << ". " << NoteNames[i] << "\n"; 
    } 

    cout << "Done!"; 

    return 0; 
} 

私はそれは私がintを返す私の他の機能のいずれかで、この問題を持っていなかったとしてgetNoteName()string戻り値の型を持つとは何かだと言いたいです。

答えて

1

noteName NoteNames[numNotes];NoteNames[numNotes - 1]はあなたがアクセスできる最大の要素である配列を定義します。

あなたはこれよりさらに1つ進みます。これを行う際の動作は未定義ですこれはあなたが観察するクラッシュとして現れています。

for (int i = 0; i < numNotes; i++)、または類似を使用してループの限界を交換してください。

(あなたは、クラス名や変数名のためのあなたのキャメルケース規則を読み取るために混乱してコードを作る通常の何からのラウンドを、切り替えている。)

(私もかなりconstexpr int numNotes = 4;を参照してくださいね:Googleのことをより多くの詳細については、 )

関連する問題