我应该制作一个代码来确定输入的字符串是否是回文,该代码应该有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 */
}