如何在不使用 C++ 中的字符串函数的情况下检查字符串是否为回文

2024-04-16

我的任务是创建一个程序来检查输入的字符串是否是回文,所以我在这里有这个简单的程序:

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

int main()
{
    char y[100], x[100];
    cout << "Enter word" << endl;
    cin >> y;
    strcpy(x, y);
    strrev(x);
    if (strcmp(y, x) == 0)
        cout << "Palindrome";
    else
        cout << "Not Palindrome";
    system("pause");
    return 0;
}

但是,我不允许使用 strcpy、strrev、strcmp 等字符串函数。在这种情况下,我可能会为此程序使用字符数组。如果代码很容易理解,我可能会很感激,因为我是 C++ 的初学者。任何帮助表示赞赏。

***感谢您之前的帮助,我已经完成了大部分程序。

***我忘了添加,程序会忽略字符串中的空格,例如“rad ar”或“赛车”仍将作为回文返回。遗憾的是,我不知道如何编写这个空间检查函数。


回文就是第一个字符等于最后一个字符的单词,依此类推。因此,为了检查它是否是回文,您只需要复制 strlen 函数的功能即可知道要比较第一个字符的字符的位置。

在 C++ 中,使用变量,可以通过 while 循环轻松完成:

int i = 0;
// Is this a null terminating character?
while (y[i])
{
    // Move to the next character
    i++;
}

为了让事情变得更简单,并真正成为 strlen 的替代品,可以将其放入一个函数中:

int stringLength (char *input)
{
    int i = 0;
    while (input[i])
    {
        i++;
    }
    return i;
}

现在您只需循环输入,将第一个字符与最后一个字符进行比较,将第二个字符与倒数第二个字符进行比较,依此类推...您只需记住,由于数组的工作方式,最后一个字符是实际上在位置len-1。

#include <iostream> // required for cout, and cin

// returns the length of a c style string
int stringLength(char *input)
{

    int i = 0;
    // Is this a null terminating character
    while (input[i])
    {
        // No, check the next character
        i++;
    }
    return i;
}

int main()
{
    // Get input from the user.
    char input[100];
    std::cin >> input;

    // Calculate the length of the input
    int length = stringLength(input);

    // At position length is the null terminating character,
    // the last character is actually at position len - 1
    int lastIndex = length - 1;

    // Stores whether of not we found a palindrome
    bool isPalindrome = true;

    // Loop through the string checking if the first character is equal to
    // the last, second to second last etc...
    for (int i = lastIndex; i >= length/2; i--)
    {
        // Check the palindrome condition
        if (input[i] != input[lastIndex - i])
        {
            isPalindrome = false;
            break;
        }
    }

    // Output the result
    if (isPalindrome)
    {
        std::cout << "Palindrome" << std::endl;
    }
    else
    {
        std::cout << "Not palindrome" << std::endl;
    }

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用 C++ 中的字符串函数的情况下检查字符串是否为回文 的相关文章

  • 为什么通过派生类对基类的引用与 :: - 运算符不明确?

    所以我想知道为什么以下钻石问题的代码片段无法编译 我知道这个问题通常是通过虚拟继承来解决的 我不是故意使用它的 该代码只是为了展示我的问题 即为什么编译器称此不明确 因此 我在 struct Base 中声明了两个成员变量 因为这两个子类
  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的

随机推荐