2017-02-25 13 views
0

C++で小さなプログラムを作成しましたが、コンパイル時にエラーは発生しませんでしたが、プログラムを実行するとエラーが発生します。C++ .exeが動作を停止しました - コードでエラーが発生しました

#include <iostream> 
#include <fstream> 
#include <string> 

#include <sstream> 
#include <stack> 
#include <queue> 

#include "QueType.h" 
#include "StackType.h" 
#include "tools.hpp" 

#include <locale> 

#include <list> 

using namespace std; 



bool isPalindrome(const string& stringToCheck) 
{ 
string line2; 
bool pal; 
string wrdF; 
stack<char> word1; 
queue<char> word2; 

char x,y; 

line2=stringToCheck; 

// make lowercase 
for (size_t j=0; j< line2.length(); ++j) 
{ 
line2[j] = tolower(line2[j]); 
} 

std::locale loc; 
std::string str = line2 ; 
std::string::size_type al=0; 

wrdF = ""; 
std::string::size_type al2 = 0; 
while ((al<str.length()) ) { 

    if (std::isalnum(str[al])) { 
     wrdF += str[al]; 

     al2++; 
    } 

    ++al; 
} 

ItemType* items = new ItemType[al2]; 
strcpy(items,wrdF.c_str()); 

int oo=(int)al2; 
for (int q=0;q<oo ;q++) 
{ 
if (items[q] != ' ') { 
    word1.push(items[q]); 
    word2.push(items[q]); 
} 
} 
pal = true; 
while (!word1.empty() && !word2.empty()) 
{ 
    x=word1.top(); 
    y=word2.front(); 
    if (x != y) 
    { 
     cout << "No palindrome" << endl; 
     pal=false; 

     break; 
    } 
    else 
    { 
     word1.pop(); 
     word2.pop(); 
    } 

} 

if (pal == true) 
    cout << " palindrome" << endl; 

return(pal); 

} 


int main() 
    { 

int row=0; 
string line; 
bool pali; 
ifstream myfile ("palindrome-testfile.txt"); 

ofstream palin("palindromes.log"); 
ofstream nopalin("nopalindromes.log"); 

if (myfile.is_open()) 
{ 

while (getline (myfile,line)) 
{ 

//  cout << line << '\n'; 
    ++row; 
//  cout<<row<<". "; 


pali= isPalindrome(line); 


if (pali) 
{ 
    palin << line << endl; 
} 
else 
{ 
    nopalin << line << endl; 
} 
} 

myfile.close(); 
} 

else cout << "Unable to open file"; 

return 0; 
} 

はそれを解決するために私を助けてください:以下の は私のコードです。前もって感謝します。

Capture of error

+0

画像を正しくアップロードしてください。 http://stackoverflow.com/questions/28496851/how-to-upload-pictures-to-stackoverflow-for-posting –

+1

'ItemType'とは何ですか?私はそれが 'char'のtypedefであると仮定します。この場合、ここで問題があります:' ItemType * items = new ItemType [al2]; strcpy(items、wrdF.c_str()); 'NULを終了するためのスペースを割り当てていないので、バッファオーバーランがあります。いずれにせよ、ここでヒープ割り当てされたバッファを使用することを突然決定した理由は明らかではありません。他の場所で 'std :: string'をうまく使用して' char'のシーケンスを管理してください。 'items'も漏れていることにも注意してください。 –

+0

'palindrome-testfile.txt'には何がありますか?特に5行目にありますか?ラテン文字以外の文字はありますか?もしstr :: isalnum((unsigned char)(str [al]))) '()と' –

答えて

0

イゴールTandetnikは、問題を指摘したようにitemTypeにポインタです。それはまたメモリを漏らす。

単語が回文かどうかをチェックする同様のコードを書いています。 cppreference example for std::equalはis_palindrome関数です。

std::isalnumの手順が必要な理由がわかりません。それも数字の真実を返すでしょう。 std::isalphaは、文字である場合にのみtrueを返します。see cppreference doc for isalpha

説明が必要な場合はお知らせください。

#include <algorithm> 
#include <string> 
#include <sstream> 
#include <iostream> 
#include <fstream> 

bool isPalindrome(const std::string& str) { 
    return std::equal(str.begin(), str.begin() + str.size()/2, str.rbegin()); 
} 

int main() { 
    std::ifstream myfile("palindrome-testfile.txt"); 

    if(!myfile.is_open()) { 
     std::cerr<< "Could not open file" << std::endl; 
    } else { 

     std::string word; 
     //operator >> will read words until you reach eof() 
     myfile >> word; 

     while(!myfile.eof()){ 
      auto str = word; 
      //here I delete anything that is not alnum 
      str.erase(std::find_if(str.begin(), str.end(), 
        [](unsigned char c) { return !std::isalnum(c); })); 

      //Making all characters of the string lower case 
      std::transform(str.begin(), str.end(), str.begin(), 
        [](unsigned char c) { return std::tolower(c); }); 

      if(isPalindrome(str)) { 
       std::cout << "[" << str <<"] is palindrome" << std::endl; 
      } else { 
       std::cout << "[" << str <<"] is not palindrome" << std::endl; 
      } 
      myfile >> word; 
     } 
     myfile.close(); 
    } 

    return 0; 
} 
関連する問題