C - 带字符串的递归

时间:2017-05-27 17:16:43

标签: c string pointers recursion

我试图在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;
}

现在它的工作,但只有第一个字符和中间它没有移动检查下一个字符 帮助某人做什么?

3 个答案:

答案 0 :(得分:0)

正如@ some-programmer-dude所说,pstartpmiddle只是字符变量,它们被赋值为str[0]str[(strlen(str) - 1) / 2],而不是它们各自的地址。在函数中,您传递的地址为pmidpstart。您应该按如下方式更改代码 -

替换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;
}