首页 > 解决方案 > 回文但有香味

问题描述

所以写一个带有指针和布尔值的回文。我让它与一个单词一起工作,但后来我开始构建它来与一个句子一起工作。问题是我不确定如何在将新的修改后的句子变成小写并去掉空格以返回它是否是回文后如何保留它。它一直将回文返回为假,当我去检查为什么我看到程序忽略修改并保留原始字符串时。当我测试它时,我不能在参数上使用“&”。任何提示或承担我可以做些什么来保留新修改的字符串?

int main()
{
    userInput();
    return 0;
}

void userInput()
{
    char str[90];

    std::cout<<"Please enter a string to check if it is a palindrome:  ";
    std::cin.getline(str, 90);

    modifyString(str);
}

void modifyString(char *string)
{
    int count = 0;

    for (int i=0; i<strlen(string); i++)
    {
        putchar(tolower(string[i]));
    }

    for (int i = 0; string[i]; i++)
    {
        if (string[i] != ' ')
        {
            string[count++] = string[i];
        }
    }
    string[count] = '\0';

    std::cout<<string<<std::endl;

    results(string);
}

bool checkPalindrome(char *string)
{
    char *begin;
    char *end;

    begin = string;
    end = (string + strlen(string)-1);

    while(begin != end)
    {
        if ((*begin) == (*end))
        {
            begin ++;
            end--;
        }
        else
        {
            return false;
        }
    }
    return true;
}
void results(char *string)
{
    bool isItPalindrome;

    isItPalindrome = checkPalindrome(string);

    if( isItPalindrome == true)
    {
        std::cout<<"\nCongrats, the string is a palindrome!";
    }

    else
    {
        std::cout<<"\nThis string is not a palindrome.";
    }
}

标签: c++c-stringspalindromefunction-definition

解决方案


首先,这个 main 的定义

int main()
{
    userInput();
    return 0;
}

没有意义。根据函数名main,函数应该执行的主要任务是输出输入的句子是否是回文。

这个for循环

for (int i=0; i<strlen(string); i++)
{
    putchar(tolower(string[i]));
}

没有任何用处。它只是以小写形式输出字符串。

这个说法

end = (string + strlen(string)-1);

如果传递了一个空字符串,则可以调用未定义的行为。

这个while循环

while(begin != end)
{
    if ((*begin) == (*end))
    {
        begin ++;
        end--;
    }
    else
    {
        return false;
    }
}

也可以为包含偶数 ofo 字符的字符串调用未定义的行为,因为在此 if 语句之后

    if ((*begin) == (*end))
    {
        begin ++;
        end--;
    }

如果两个相邻字符相等,则begin递增后将大end于其递减后。因此,循环将继续其迭代。

通常,更改原始字符串的方法只是一种不好的方法。你的程序有太多的功能。编写一个函数来确定传递的字符串是否为回文就足够了。

这是一个演示程序。

#include <iostream>
#include <cstring>
#include <cctype>

bool checkPalindrome( const char *s )
{
    const char *t = s + std::strlen( s );
    
    do
    {
        while ( s != t && std::isspace( ( unsigned char )*s ) ) ++ s;
        while ( s != t && std::isspace( ( unsigned char )*--t ) );
    } while ( s != t && 
              std::tolower( ( unsigned char )*s ) == tolower( ( unsigned char ) *t ) &&
              ++s != t );
    
    return s == t;
}

int main() 
{
    const size_t N = 100;
    char s[N] = "";

    std::cout << "Please enter a string to check if it is a palindrome:  ";
    std::cin.getline( s, N );
    
    std::cout << '\n';
    
    if ( checkPalindrome( s ) )
    {
        std::cout << "Congrats, the string is a palindrome!\n";
    }
    else
    {
        std::cout << "This string is not a palindrome.\n";
    }
    
    return 0;
} 

它的输出可能看起来像

Please enter a string to check if it is a palindrome:  1 23 456 6 54 321

Congrats, the string is a palindrome!

推荐阅读