C++ C++;-检查单词在结构数据类型中是否为回文

C++ C++;-检查单词在结构数据类型中是否为回文,c++,arrays,struct,types,palindrome,C++,Arrays,Struct,Types,Palindrome,我想知道如何检查一个单词在struct数据类型或object中是否是回文的。我想从文件中读取一个数据,然后我需要检查我读过的单词类型是否是回文。我还需要颠倒单词的顺序,但我这样做了,所以不需要任何帮助 代码如下: #include <iostream> #include <fstream> #include <string> #include <algorithm> using namespace std; struct lettersStr

我想知道如何检查一个单词在struct数据类型或object中是否是回文的。我想从文件中读取一个数据,然后我需要检查我读过的单词类型是否是回文。我还需要颠倒单词的顺序,但我这样做了,所以不需要任何帮助

代码如下:

#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";
    }
我认为主要的问题是:

for (int i = 0; i < j; i++,j--)
    {
        if (things[i].name.at(i) != things[i].name.at(j))
        x = false;
for(int i=0;i
正如你们所看到的,它不能正确地检查一个单词是否是回文。 P:如果这是个愚蠢的问题,我是C++编程初学者。
为(inti=0;i同时循环
事物
及其
名称
s的字母。您还必须考虑比较小写字母和大写字母的情况,例如“Kayak”开头和结尾的“K”和“K”。您可以使用
std::tolower

下面是一个例子():


正如已经在评论中指出的那样,
for(inti=0;i
同时循环
事物
及其
名称
s的字母。您还必须考虑比较小写字母和大写字母的情况,例如“Kayak”开头和结尾的“K”和“K”。您可以使用
std::tolower

下面是一个例子():


没有愚蠢的问题,但问题出在哪里还不太清楚。代码出了什么问题?预期的输出是什么?看看这个例子@。它很好地完成了回文检查。你有
for(int i=0;i
但是
if(things[i].name.at(i)!=things[i].name.at(j))
。这个循环是应该通过
事物
还是通过一个
名称
?它不能同时完成这两个任务。@churill是的,我希望它只通过名称进行循环是的,但仔细看看这个循环现在正在做什么。你应该使用单独的函数来检查字符串是否是回文。没有愚蠢的问题,但它确实存在不太清楚问题出在哪里。代码出了什么问题?预期的输出是什么?看看这个例子@。它的回文检查非常好。你有
for(int i=0;i
但是
if(things[i].name.at(i)!=things[i].name.at(j))
。这个循环应该通过
事物
还是通过一个
名称
进行迭代?它不能同时完成这两个任务。@churill是的,我希望它只通过名称进行循环是的,但是仔细看看这个循环现在正在做什么。你应该使用单独的函数来检查字符串是否是回文。你能解释一下它的作用吗“std::vector vec={lettersStr{“皮艇”、“船”},lettersStr{“奥迪”、“汽车”};“是什么意思?因为我想从文件中读取数据,而向量接缝的这种形式让我很困惑。对于长度超过
UINT_MAX
@SamedŠkulj的字符串,这会表现得很奇怪。它被称为列表初始化,只是初始化向量的两个元素。第一个元素是
lettstr
with
name=“Kajak”
object=“Boat”
,第二个元素命名为“Audi”,并且
object
字段中填充了“Car”@StefanKssmr当然,它会一直工作,直到有一天突然不起作用:-)你可以用
size\u t
代替
unsigned int
@Samed这只是循环向量的元素。如果你想了解更多信息,它被称为基于范围的循环。你能解释一下“std::vector vec={lettersStr皮艇、船、字母STR{“奥迪”、“汽车”}是什么意思?因为我想从文件中读取数据,而向量接缝的这种形式真的让我很困惑。对于长度超过
UINT_MAX
@SamedŠkulj的字符串,这会表现得很奇怪。它被称为列表初始化,只是初始化向量的两个元素。第一个元素是
lettstr
with
name=“Kajak”
object=“Boat”
,第二个元素命名为“Audi”,并且
object
字段中填充了“Car”@StefanKssmr当然,它会一直工作,直到有一天突然不起作用:-)你可以用
size\t
代替
unsigned int
@Samed这只是循环向量的元素。如果你想了解更多信息,它被称为基于范围的循环。
for (int i = 0; i < j; i++,j--)
    {
        if (things[i].name.at(i) != things[i].name.at(j))
        x = false;
#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