C ++ .exe已停止工作 - 代码错误

时间:2017-02-25 06:49:11

标签: c++11 stack queue palindrome

我用c ++编写了一个小程序,它在编译时没有任何错误,但是当我运行程序时,我面临一个错误。 以下是我的代码:

#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

1 个答案:

答案 0 :(得分:0)

正如Igor Tandetnik指出问题在于ItemType指针。这也泄漏了记忆。

我写了一个类似的代码,检查一个单词是否是回文。 cppreference example for std::equal是is_palindrome函数。

我不确定您为什么需要std::isalnum的步骤。对于数字,那个也将返回true。 std::isalpha只有在字母为see cppreference doc for isalpha

时才会返回true

如果您需要任何澄清,请与我们联系。

#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;
}