Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数C+中的回文返回false+;_C++_String - Fatal编程技术网

C++ 函数C+中的回文返回false+;

C++ 函数C+中的回文返回false+;,c++,string,C++,String,出于某种原因,在下面的递归函数中 #include <iostream> #include <string.h> using namespace std; int n, m, p = 0; char A[510][510]; void DFS(int x, int y, string s){ if(x == n && y == m){ if (s == string(s.rbegin(), s.rend())) p++;

出于某种原因,在下面的递归函数中

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

int n, m, p = 0;
char A[510][510];

void DFS(int x, int y, string s){
    if(x == n && y == m){
        if (s == string(s.rbegin(), s.rend())) p++;
    } else {
        if(x < n) DFS(x+1, y, s + string(1, A[x][y]));
        if(y < m) DFS(x, y+1, s + string(1, A[x][y]));
    }
}

int main() {
    // your code goes here

    cin>>n>>m;
    for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            cin>>A[i][j];

    string s = "";
    DFS(0, 0, "");
    cout<<p<<endl;
    return 0;
}
是因为功能吗? s采用的一些值是:aaa、aba、aabaa、abb、bab

我已确保s

附言:我已经检查过,x==n&&y==m确实实现了

输入示例:

3 4
aaab
baaa 
abba

输出0。回文:aaaaaa,abaaba,aaaaaa您的问题在于以下几行:

    if(x < n) DFS(x+1, y, s + string(1, A[x][y]));
    if(y < m) DFS(x, y+1, s + string(1, A[x][y]));
if(x
在第一行,它可能是
y==m
,在第二行,它可能是
x==n

然后使用这些值访问有效输入范围之外的
A
。现在,这些值被初始化为零,这将导致字符串中添加
'\0'
字符,该字符对
std::string
完全有效,它可以包含该字符,而不标记字符串的结尾,就像在C字符串中一样!即使在打印时,它们也只是被跳过,而不是在那里结束该字符串的打印

要进行验证,请在反转字符串之前,尝试打印字符串的长度以及字符串内容。您会注意到长度始终为7,即使打印的字符串较短。然后,当你用这些零字节反转字符串时,它们也会被反转,因此你最终得到的反转字符串的开头是零字节(打印时跳过且不可见),而original的结尾是零字节,因此它们是不同的


现在,我将为您实际修复算法,但粗略的解决方案是在反转字符串之前删除尾随零。

也许您应该使用调试器,查看
字符串(s.rbegin(),s.rend())
的结果是什么,以及字符串是否实际等于
s
的内容。我已经这样做了。结果是s和反s都有相同的值@上尉很讨厌。我甚至打印了这样的字符串:s:aba:d:aba:如果比较失败,要么字符串不一样,要么代码中的其他地方有一个bug对比较或其他相关代码产生了影响。代码中的其他地方有bug吗?这对代码的这一部分有什么影响?这可能是因为我将字符串作为参数传递?不知为什么,这就是原因吗@在这种情况下,请尝试将中间值(在本例中为反向字符串)放入临时变量,并将其与s一起打印,以查看是否首先达到了比较,并查看值的确切值。感谢您的解释!
    if(x < n) DFS(x+1, y, s + string(1, A[x][y]));
    if(y < m) DFS(x, y+1, s + string(1, A[x][y]));