错误:来自' char'的无效转换到#char; char *'在回文计划中

时间:2016-03-02 21:30:09

标签: c++

此代码试图测试字符串是否为回文结构。它读取一串字符,在读取时将每个字符推入堆栈并同时将其添加到队列中。然后,它使用基本的堆栈和队列操作来确定字符串是否是回文。

程序在遇到上述错误时会爆炸:

inStack.push(inString[i]);
inQueue.push(inString[i]);

我不明白为什么或如何解决它。我已经对这个错误进行了研究,因为它适用于我的案例并没有取得多大成果。我对c ++很新,所以请原谅我,如果我忽略了一些愚蠢的东西。

代码如下:

#include <iostream>
#include <stack>
#include <queue>
#include <string>

using namespace std;

int main()
{
    stack <string> inStack; 
    queue <string> inQueue;
    string inString; //user input
    int inLength; //loop counter variable
    bool isPalindrome(false);

    cout<<"Enter a word to see if it is a palindrome: ";
    cin>>inString;

    if (inString.size() > 0)
    {
        for (int i = 0; i <= inLength; i++)
        { 
            inStack.push(inString[i]); //put string chars onto stack
            inQueue.push(inString[i]); //add string chars to queue
        }

        isPalindrome = true;

        while (isPalindrome && (!inStack.empty()) && (!inQueue.empty()))
        {
            if (inStack.top() != inQueue.front())
            {
                isPalindrome = false;
            }
            else
            {
                inStack.pop();
                inQueue.pop();
            }
        }
    }

    if(isPalindrome == false)
    {
        cout<<"It is not a palindrome."<<endl;
    }
    else
    {
        cout<<"It is indeed a palindrome."<<endl;
    }

return 0;
}

2 个答案:

答案 0 :(得分:1)

您的代码中有三个主要错误。

您正在将字符推送到堆栈和定义为保存字符串的队列。字符串构造函数不能隐式地从char转换为字符串,因为没有构造函数接受char。你可能想把它们定义为:

stack<char> inStack;
queue<char> inQueue;

你没有设置inLength;我建议添加像

这样的东西
inLength = inString.size();

if (inString.size() > 0) {修复后。

最重要的是,你使用i <= inLength(在你的for循环条件中),这是行不通的;您应该使用<,因为push inString[inString.size()]实际上推送的一个字符超出您输入的字符,这将始终导致isPalindrome == false,因为您的堆栈和队列将无效相应的顶部和前面的(随机垃圾)字符。

这三项更改似乎足以修复您的项目。

一个更简单的解决方案,为您提供一个示例,说明如何使用C ++迭代器来减少为这些事情编写的代码量:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<char> left, right; // left-to-right and right-to-left lists

    cout<<"Enter a word to see if it is a palindrome: ";
    string inString; //user input
    cin>>inString;

    if(!inString.empty()){
        // add characters left to right
        left.insert(left.end(), inString.begin(), inString.end());
        // add characters in reverse order, right to left
        right.insert(right.end(), inString.rbegin(), inString.rend());
        // compare the two vectors
        if(left == right)
            cout<<"It is indeed a palindrome."<<endl;
        else
            cout<<"It is not a palindrome."<<endl;
    }
}

答案 1 :(得分:0)

你忘了给inLength分配字符串的实际长度并得到一个外部我变得非常大,比它应该更大,你可能会遇到分段错误。

在读取字符串后尝试正确分配值。

inLength = inString.size();

我希望这会对你有所帮助。