我写了一个代码来检查一个字符串是否是回文,它应该排除空格和特殊字符,并且应该区分大小写。所以函数isPalin的(字符串A)接受一个字符串,如果它是回文,则返回1,如果它不是回文,则返回0。
例如:输入:一个人,一个计划,一条运河:巴拿马输出:1下面是代码-
int isPalindrome(string A) {
string::iterator it;
string::reverse_iterator rit;
it=A.begin();
rit=A.rbegin();
while(it!=A.end() && rit!=A.rend()){
while(!isalnum(*rit)) //if char from the end is not alphanumeric, then increment the reverse iterator till we find the alphanumeric char.
++rit;
while(!isalnum(*it)) //if char from the start is not alphanumeric, then increment the iterator till we find the alphanumeric char.
++it;
if(tolower(*it)!=tolower(*rit)) //case in-sensitive comparison
return 0;
++it;
++rit;
}
return 1;
}
它适用于所有输入的变化,如一个人,一个计划,一个运河:巴拿马
或一个人,一个计划,一个运河:巴拿马
,但是当我输入一个人,一个计划,一个运河:巴拿马
时,它会因运行时错误而失败。
所以请让我知道我哪里出错了?
问题是两个迭代器可能都到达了嵌套的while循环的末尾,应该对此进行检查。
int isPalindrome(string A) {
string::iterator it;
string::reverse_iterator rit;
it=A.begin();
rit=A.rbegin();
while(it!=A.end() && rit!=A.rend()){
while(rit != A.rend() && !isalnum(*rit)) //if char from the end is not alphanumeric, then increment the reverse iterator till we find the alphanumeric char.
++rit;
while(it != A.end() && !isalnum(*it)) //if char from the start is not alphanumeric, then increment the iterator till we find the alphanumeric char.
++it;
if (it == A.end() || rit == A.rend())
break;
if(tolower(*it)!=tolower(*rit)) //case in-sensitive comparison
return 0;
++it;
++rit;
}
return 1;
}