提问者:小点点

布尔函数返回false,即使满足条件在c中返回true。为什么?


我的函数是一个简单的回文算法,它应该接受一个输入整数(test),将其转换为字符串(test_s),然后在新变量(test_s_reverse)中反转该字符串,然后如果test_s等于test_s_reverse则返回true。

bool is_palindrome(int test){
    test_s = to_string(test);
    test_length = test_s.length();
    for (int i=(test_length + 1); i>=0; i--){
        test_s_reverse += test_s[i];
    }
    if (test_s_reverse == test_s){
        return true;
    }
    else {
        return false;
    }
}

我创建了一个main函数来测试结果,使用输入12321,程序返回false,即使couttest_s_reverse=12321,test_s=12321。

我做错了什么?


共2个答案

匿名用户

您应该使用test_length-1而不是test_lenght1,因为在新的反向字符串中,您有一些额外的字符,如果您打印它们,您将无法看到它们。

. long()函数返回字符串中的字符数。所以你要么使用test_length,但你使用i

但是,如果您从test_length开始,则需要进行编辑,因为test_length位置没有字符:

test_s_reverse += test_s[i-1];

如果您使用纯C代码,它应该如下所示:

bool is_palindrome(int test){
    string test_s = to_string(test);
    int test_length = test_s.length();
    string test_s_reverse;
    for (int i=(test_length); i>0; i--){
        test_s_reverse += test_s[i-1];
    }
    if (test_s_reverse == test_s){
        return true;
    }
    else {
        return false;
    }
}

匿名用户

如果由我决定,我会以不同的方式做这项工作。

std::string有一个构造函数来为一对迭代器构建字符串。它还支持反向迭代器。因此,您可以像这样更轻松地构造一个反向字符串:

std::string test_s_reversed(test_s.rbegin(), test_s.rend());

…但是考虑到这在很大程度上简化了任务,你可以把大部分简化成这样:

bool is_palindrome(std::string const &s) { 
    return s == std::string(s.rbegin(), s.rend());
}

整数的实现将如下所示:

bool is_palindrome(int val) {
    return is_palindrome(std::to_string(val));
}