我试图在C
中编写一个函数来获取2个指针,一个用于字符串中的第一个字符,另一个用于字符串中的中间字符。该函数需要检查字符串的前半部分是否与后半部分相同(忽略大写和小写)并返回"TRUE"
或"FALSE"
。
我不知道是什么阻止了递归的条件以及它为什么不起作用。
这是我的代码。错误是什么?
#define SIZE 80
enum { FALSE = 0, TRUE = 1 };
int CheckString(char* start, char* middle);
int main()
{
char str[SIZE], *pstart, *pmiddle;
printf("Enter a String-->:");
fgets(str, SIZE, stdin);
pstart = &str[0];
pmiddle = &str[(strlen(str) - 1) / 2];
printf(" %d \n", CheckString(pstart, pmiddle));
return 0;
}
int CheckString(char* start, char* middle)
{
if (middle == '\0');
return TRUE;
if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32))
CheckString(start + 1, middle + 1);
else
return FALSE;
}
我将其更改为此代码
int CheckString(char* start, char* middle)
{
if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32))
{
CheckString(start + 1, middle + 1);
return TRUE;
}
else
return FALSE;
}
现在它的工作,但只有第一个字符和中间它没有移动检查下一个字符 帮助某人做什么?
答案 0 :(得分:0)
正如@ some-programmer-dude所说,pstart
和pmiddle
只是字符变量,它们被赋值为str[0]
和str[(strlen(str) - 1) / 2]
,而不是它们各自的地址。在函数中,您传递的地址为pmid
和pstart
。您应该按如下方式更改代码 -
替换pmid和pstart。而是将它们更改为指针 -
char* pstart,pmid;
pstart = &str[0];
pmiddle = &str[(strlen(str) - 1) / 2];
答案 1 :(得分:0)
我认为你仍然可以使用循环来归档这个。这是您修改后的工作代码。修复别人提及的问题。
#define SIZE 80
enum { FALSE = 0, TRUE = 1 };
int CheckString(char* start, char* middle);
int main()
{
char str[SIZE];
char *pstart = NULL;
char *pmiddle = NULL;
printf("Enter a String-->:");
fgets(str, SIZE, stdin);
pstart = &str[0];
pmiddle = &str[(strlen(str) - 1) / 2];
printf(" %d \n", CheckString(pstart, pmiddle));
return 0;
}
int CheckString(char* start, char* middle)
{
int flag = 0;
char * end = middle;
while (start != end) {
if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32))
flag = 1;
else
flag = 0;
start++; middle++;
}
return flag;
}
递归版
#define SIZE 80
enum { FALSE = 0, TRUE = 1 };
int CheckString(char* start, char* middle, char* end, int []);
int main()
{
char str[SIZE];
char *pstart = NULL;
char *pmiddle = NULL;
char *end = NULL;
int flag[1];
*flag = 0;
printf("Enter a String-->:");
fgets(str, SIZE, stdin);
pstart = &str[0];
pmiddle = &str[(strlen(str) - 1) / 2];
end = pmiddle;
printf(" %d \n", CheckString(pstart, pmiddle , end, flag));
return 0;
}
int CheckString(char* start, char* middle, char* end, int *flag)
{
if (start == end)
return *flag;
else
{
if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32))
*flag = 1;
else
*flag = 0;
start++; middle++;
return CheckString(start, middle, end, flag);
}
}
答案 2 :(得分:0)
其他答案指出了主要问题,即你必须返回递归调用函数返回的值,但代码中还有其他问题。
当fgets
用于收集用户输入时,它也会复制换行符,这会使您的功能失败。
这是一个可能的修复,还有其他一些提示:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
#define SIZE 160
bool CheckString(char* start, char* middle);
int main()
{
char str[SIZE];
for (;;)
{
printf("Enter a String-->:");
if ( fgets(str, SIZE, stdin) == NULL ) break;
// remove the newline copied in the string by fgets
size_t length = strcspn(str, "\n");
str[length] = '\0';
if ( length == 0 ) continue;
printf("%s\n", CheckString(str, str + length / 2) ? "True" : "False");
}
return 0;
}
bool CheckString(char* start, char* middle)
{
if ( *middle == '\0') return true;
// ^ note this ^ here there was a ;
if ( tolower(*start) == tolower(*middle) )
return CheckString(start + 1, middle + 1);
else
return false;
}