为什么我的回文函数不适用于 C 中的空格?
Why does my palindrome function not work with spaces in C?
我写了一个回文函数,对于那些不知道的人来说,意思是一个接受 word/phrase/sentence 和 returns 的函数,如果 word/phrase/sentence 是同一个字符串反转。
出于某种原因,我的函数仅适用于没有 space 的情况。
isPalindrome("madam")
returns true
正确。
isPalindrome("nurses run")
returns false
不 正确
函数如下:
#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux;
ptr = str;
while (*ptr != '[=10=]') {
++ptr;
}
--ptr;
for (aux = str; ptr >= aux;) {
if (*ptr == *aux) {
--ptr;
aux++;
}
else{
break;
}
}
if (aux > ptr){
return true;
}
else{
return false;
}
}
Calling/Driver代码:
printf("Question 6a: %s\n", isPalindrome("nurses run") ? "true" : "false"); // prints false - not expected
printf("Question 6b: %s\n", isPalindrome("madam") ? "true" : "false"); // prints true as expected
有什么方法可以容纳原始字符串中的 space 个字符?
为什么不用另一种方式来解决这个问题?
检查您的初始字符串,查看字符串的大小(没有白色-space),除以二。如果奇怪,特殊情况。如果偶数,运行 从开始到中间,并在 for 循环中比较 [i] 和 [size-i]
对于奇数,执行相同的操作但不触及确切的中间元素(最终结果相同)
^至于 "run through",我知道你不想要 white-space,但你可以创建一个没有 white-space 的临时字符串。您知道字符串的最大大小,因此 allocating/assigning 是可行的。
在您的 for 循环中,您可以跳过空格。在 for 循环之后检查前两个 if 语句。
#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux;
ptr = str;
while (*ptr != '[=10=]') {
++ptr;
}
--ptr;
for (aux = str; ptr >= aux;) {
if(*ptr == ' ') {
--ptr;
continue;
}
if(*aux == ' ') {
aux++;
continue;
}
if (*ptr == *aux) {
--ptr;
aux++;
}
else{
break;
}
}
if (aux > ptr){
return true;
}
else{
return false;
}
}
int main() {
printf("Question 6a: %s\n", isPalindrome("nurses run") ? "true" : "false"); // prints true - as expected
printf("Question 6b: %s\n", isPalindrome("madam") ? "true" : "false"); // prints true as expected
}
你的函数检查两个字符是否相等,如果不相等,你 return false。如果您只处理字母符号(a-z、A-Z),这种态度是正确的,但如果您在字符串中有一个空格(或标点符号),您最终将比较一个字母和一个空格(或标点符号),这将立即使 isPalindrome
return 为假。
为避免该问题,您可以先去掉输入字符串中的空格(和标点符号等),将所有字母设为小写(参见第二个示例),然后比较这个,例如"nurses run"
将转换为 "nursesrun"
,而 "Was it a car or a cat I saw?"
将转换为 "wasitacaroracatisaw"
。
如果不考虑字符串中大小写字母的可能性,"testset"
会是回文,而"tEstset"
不会。
严格来说,nurses run
不是回文。因为,如果它在第 7 个字符处有 space,那么它也应该有 space 第 4 个字符。
不管怎样,这不是你需要的,对吧?
因此,您想忽略 spaces 以检查它是否是回文。您可以使用,或者创建另一个函数来删除字符串中的所有space,并在开头的回文检查函数中调用它。
我写了一个回文函数,对于那些不知道的人来说,意思是一个接受 word/phrase/sentence 和 returns 的函数,如果 word/phrase/sentence 是同一个字符串反转。
出于某种原因,我的函数仅适用于没有 space 的情况。
isPalindrome("madam")
returns true
正确。
isPalindrome("nurses run")
returns false
不 正确
函数如下:
#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux;
ptr = str;
while (*ptr != '[=10=]') {
++ptr;
}
--ptr;
for (aux = str; ptr >= aux;) {
if (*ptr == *aux) {
--ptr;
aux++;
}
else{
break;
}
}
if (aux > ptr){
return true;
}
else{
return false;
}
}
Calling/Driver代码:
printf("Question 6a: %s\n", isPalindrome("nurses run") ? "true" : "false"); // prints false - not expected
printf("Question 6b: %s\n", isPalindrome("madam") ? "true" : "false"); // prints true as expected
有什么方法可以容纳原始字符串中的 space 个字符?
为什么不用另一种方式来解决这个问题?
检查您的初始字符串,查看字符串的大小(没有白色-space),除以二。如果奇怪,特殊情况。如果偶数,运行 从开始到中间,并在 for 循环中比较 [i] 和 [size-i]
对于奇数,执行相同的操作但不触及确切的中间元素(最终结果相同)
^至于 "run through",我知道你不想要 white-space,但你可以创建一个没有 white-space 的临时字符串。您知道字符串的最大大小,因此 allocating/assigning 是可行的。
在您的 for 循环中,您可以跳过空格。在 for 循环之后检查前两个 if 语句。
#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux;
ptr = str;
while (*ptr != '[=10=]') {
++ptr;
}
--ptr;
for (aux = str; ptr >= aux;) {
if(*ptr == ' ') {
--ptr;
continue;
}
if(*aux == ' ') {
aux++;
continue;
}
if (*ptr == *aux) {
--ptr;
aux++;
}
else{
break;
}
}
if (aux > ptr){
return true;
}
else{
return false;
}
}
int main() {
printf("Question 6a: %s\n", isPalindrome("nurses run") ? "true" : "false"); // prints true - as expected
printf("Question 6b: %s\n", isPalindrome("madam") ? "true" : "false"); // prints true as expected
}
你的函数检查两个字符是否相等,如果不相等,你 return false。如果您只处理字母符号(a-z、A-Z),这种态度是正确的,但如果您在字符串中有一个空格(或标点符号),您最终将比较一个字母和一个空格(或标点符号),这将立即使 isPalindrome
return 为假。
为避免该问题,您可以先去掉输入字符串中的空格(和标点符号等),将所有字母设为小写(参见第二个示例),然后比较这个,例如"nurses run"
将转换为 "nursesrun"
,而 "Was it a car or a cat I saw?"
将转换为 "wasitacaroracatisaw"
。
如果不考虑字符串中大小写字母的可能性,"testset"
会是回文,而"tEstset"
不会。
严格来说,nurses run
不是回文。因为,如果它在第 7 个字符处有 space,那么它也应该有 space 第 4 个字符。
不管怎样,这不是你需要的,对吧?
因此,您想忽略 spaces 以检查它是否是回文。您可以使用