【问题标题】:C++ - Checking if a word is palindrome in struct data typeC ++ - 检查结构数据类型中的单词是否为回文
【发布时间】:2020-08-28 06:47:52
【问题描述】:

我想知道如何检查一个单词是否是结构数据类型或对象中的回文,无论你想如何称呼它。我想从文件中读取数据,然后我需要检查我读过的那种单词是否是回文。我也需要颠倒单词的顺序,但我这样做了,所以不需要任何帮助。

代码如下:

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

using namespace std;

struct lettersStr
{
    string name;
    string object;

};
int main(int argc, char** argv) 
{
    ifstream letter;
    letter.open("letter.txt");
    lettersStr things[200];
    int numberOfThings= 0;
    while(letter >> letter[numberOfThings].name >> letter[numberOfThings].object)
    {
        numberOfThings++;
    }

    for (int i = 0; i < numberOfThings; i++)
    {
        cout << letter[i].name << " " << letter[i].object<< endl;
    }
    string names;
    for (int i = 0; i < numberOfThings; i++)
    {
        names= things[i].name;
    }

    for (int i = numberOfThings- 1; i >= 0; i--)
    {
        cout << things[i].name << endl;
    }
    bool x = true;
    int j = names.length() - 1;
    for (int i = 0; i < j; i++,j--)
    {
        if (things[i].name.at(i) != things[i].name.at(j))
        x = false;

        if (x)
        {
            cout << "String is a palindrome ";
        }
        else
        cout << "String is not a palindrome";
    }

这是cout:

Kayak Audi
Ahmed Golf7
Ahmed
Kayak
String is not a palindrome
String is not a palindrome

我认为主要的问题是:

for (int i = 0; i < j; i++,j--)
    {
        if (things[i].name.at(i) != things[i].name.at(j))
        x = false;

如您所见,它不会找到检查单词是否为回文的正确方法。 P.S:如果这是一个愚蠢的问题,我很抱歉,我是 C++ 编程的初学者。 干杯

【问题讨论】:

  • 没有愚蠢的问题,但不太清楚是什么问题。代码有什么问题?预期的输出是什么?
  • 看看例子@std::equal。它可以很好地进行回文检查。
  • 你有for (int i = 0; i &lt; j; i++,j--),然后是if (things[i].name.at(i) != things[i].name.at(j))。这个循环应该遍历things 还是遍历one name?它不能同时进行。
  • @churill 是的,我希望它只通过名称循环
  • 是的,但请仔细看看这个循环现在在做什么。您应该使用单独的函数来检查字符串是否为回文。

标签: c++ arrays struct types palindrome


【解决方案1】:

正如 cmets 中已经指出的那样,for (int i = 0; i &lt; j; i++,j--) 同时循环通过 things 和它们的 names 的字母。您还必须考虑比较小写和大写字母的情况,例如“Kayak”开头和结尾的“K”和“k”。您可以为此使用std::tolower

这是一个示例 (live demo):

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

using namespace std;

bool is_palindrome(std::string name)
{
    if (name.empty())
        return false;


    // As has been pointed out, you can also use std::equal.
    // However, this is closer to your original approach.
    for (unsigned int i = 0, j = name.length()-1; i < j; i++,j--)
    {
        if (std::tolower(name.at(i)) != std::tolower(name.at(j)))
            return false;
    }
    return true;
}

struct lettersStr
{
    string name;
    string object;
};

int main(int argc, char** argv) 
{

    std::vector<lettersStr> vec = {lettersStr{"Kayak","Boat"},lettersStr{"Audi","Car"}};

    for (const auto &obj : vec)
        if (is_palindrome(obj.name))
            std::cout << obj.name << " is a palindrome" << std::endl;
        else
            std::cout << obj.name << " isn't a palindrome" << std::endl;
}

它给出了输出:

Kayak is a palindrome
Audi isn't a palindrome

【讨论】:

  • 你能解释一下 "std::vector vec = {lettersStr{"Kayak","Boat"},lettersStr{"Audi","Car"}};" 是什么意思吗?意思是?因为我想从文件中读取数据,而这种矢量接缝的形成让我很困惑。
  • 这对于长度超过UINT_MAX的字符串会表现得很奇怪。
  • @SamedŠkulj 称为列表初始化,只是初始化向量的两个元素。第一个元素是lettersStr,带有name = "Kajak"object = "Boat",第二个元素名为“Audi”,object 字段用“汽车”填充。
  • @StefanKssmr 当然,它会一直工作,直到有一天突然不行 :-) 你可以使用 size_t 而不是 unsigned int
  • @Samed 这只是简单地循环通过向量的元素。如果您想了解更多信息,则称为基于范围的循环。
猜你喜欢
  • 2016-04-19
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2021-07-25
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
相关资源
最近更新 更多