c-使用3个函数判断字符串是否为回文



我应该制作一个代码来确定输入的字符串是否是回文,该代码应该有3个函数。第一个是确定字符串是否为回文,第二个是使用isalpha()来删除所有非字母,第三个是使用tolower()来删除大写字母和小写字母之间的差异。我制作了所有3个单独的函数,但现在我必须将它们组合起来。代码只是抛出异常。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPalindrome(char inputString[])
{
int middle = strlen(inputString) / 2;
int len = strlen(inputString);
for (int i = 0; i < middle; i++)
if (inputString[i] != inputString[len - i - 1])
{
return 0;
}
else
{
return 1;
}
}
void checker(char stringWithoutSpace[], char bigArray[]) 
{
int j = 0;
for (int i = 0; i < strlen(stringWithoutSpace); i++)
{
if (isalpha(stringWithoutSpace[i]) != 0)
{
bigArray[j++] = stringWithoutSpace[i];
}
}
} 
void lowerCase(char* string)
{
int i;
for (i = 0; string[i]; i++) 
{
string[i] = tolower(string[i]);
}
}
#define SIZE 1000
int main(void) {
int repeat = 1;
char arrayPalindrome[SIZE];
char bigArray[SIZE];

while (repeat == 1)
{   
printf("Enter a sentence: ");
scanf_s("%s", &arrayPalindrome);
checker(arrayPalindrome, bigArray);
lowerCase(arrayPalindrome, bigArray);
if (isPalindrome(arrayPalindrome) == 1) 
{
printf("This is a palindrome.");
}
else
{
printf("this in not a palindrome: ");
}
printf("Do you want to enter another sentence (0 for no, 1 for yes)?");
scanf_s("%d", &repeat);
}
return 0;
}

对于初学者来说,scanf_s的调用是不正确的。

scanf_s("%s", &arrayPalindrome);

你必须写

scanf_s("%s", arrayPalindrome, rsize_t( sizeof( arrayPalindrome ) ) );

函数checker不会在数组bigArray中生成字符串,因为您忘记将数组中存储的字符序列附加为终止零字符''

此外,该函数没有意义,因为程序中不再使用数组bigArray

函数lowerCase用一个参数声明

void lowerCase(char* string);

但调用时有两个自变量。

lowerCase(arrayPalindrome, bigArray);

请注意,不需要声明辅助数组bigArry

并且程序不应该更改原始字符串。

例如,程序可以按照以下方式查找

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int lowerCase( char c )
{
return tolower( c );
}
int checker( char c )
{
return isalpha( ( unsigned char )c ) != 0;
}

int isPalindrome( const char s[] )
{
int is_palindrome = 1;
for (const char *first = s, *last = s + strlen( s ); is_palindrome && first < last; ++first)
{
while (first < last && !checker( *first )) ++first;
if (first != last)
{
while (--last != first && !checker( *last ));
}
is_palindrome = first == last || lowerCase( *first ) == lowerCase( *last );
}
return is_palindrome;
}
int main( void )
{
const char *s = "12A b B a345";
printf( ""%s" is %spalindromen", s, isPalindrome( s ) ? "" : "not " );
}

程序输出为

"12A b B a345" is palindrome

其他人在评论和回答中已经解决了您提交的代码中的不足。这个答案解决了这个问题的启发式方法。

正如您所经历的,每一行代码都是错误发生的机会。

承认问题陈述可能已经指定了";写三个函数";,没有必要那么多。一个单一的功能可以完成所有必要的功能:

#include <stdio.h> // all that is needed
bool isPalindrome( const char s[] ) {
// a "custom" 7bit ASCII "look up" table with exclusion ('.') and 'tolower()' equivalence
char *tbl =
"................................................0123456789......"
".abcdefghijklmnopqrstuvwxyz......abcdefghijklmnopqrstuvwxyz.....";
// 'L'eft and 'R'ight indexing into the passed string
size_t L = 0, R = 0;
// find the end of the string (its 'r'ight index)
while( s[R] ) R++; // poor boy's 'strlen(s)'. '' does not matter.
do {
// adjust indexes L & R rejecting characters
// seek to "meet in the middle" of a palindromic string
while( L <= R && tbl[ s[L] ] == '.' ) L++;
while( L <= R && tbl[ s[R] ] == '.' ) R--;
} while( L <= R && tbl[ s[L] ] == tbl[ s[R] ] && (L+=1) > 0 && (R-=1) > 0 );
// string is palindromic if it has passed the tests above
return L >= R;
}
int main() {
// without the drudgery of re-entering test strings,
// this "test harness" examines 3 different strings
// giving the evaluation of each. Easy to add more test cases.
char *strs[] = {
"LeVrEl",
"level",
"123Madam I'm    Adam321",
};
for( int i = 0; i < sizeof strs/sizeof strs[0]; i++ )
printf( "%s - '%s'n", isPalindrome( strs[i] ) ? "Yes" : "No ", strs[i] );
return 0;
}
No  - 'LeVrEl'
Yes - 'level'
Yes - '123Madam I'm    Adam321'

代码行要少得多,应该是";易于遵循";当人们将字符串设想为简单的连续字符数组时。

如果任务是写3个函数,可以再加两个"0";无操作";满足该标准的功能:

int thing1(void) { return 1; }
int thing2(void) { return 2; }

编辑:有了使用标准库函数的(非常好的(建议,这里又是大致相同的事情(仍然认为数字是"可测试的"字符。(

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPalindrome( const char s[] ) {
const unsigned char *u = (unsigned char *)s;
size_t L = 0, R = strlen( s );
do {
while( L <= R && !isalpha(u[L]) && !isdigit(u[L]) ) L++;
while( L <= R && !isalpha(u[R]) && !isdigit(u[R]) ) R--;
} while( L <= R && tolower(u[L]) == tolower(u[R]) && (L+=1) > 0 && (R-=1) > 0 );
return L >= R;
}
int main() {
/* same as above */
}

相关内容

  • 没有找到相关文章

最新更新