0

我想编写一个从给定字符串中获取子字符串的程序。

然后,程序将检查子串是否为回文。如果是回文,它将在其他任何地方列出它们,然后它会整理出独特的回文。

但是有什么过程可以让我将多个字符串单独放入一个数组中吗?

我编写了一个程序来计算有多少子串是回文,但是我不知道如何从它们中计算唯一的回文。

我的代码在下面:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
char* substring(char*,int,int);
int is_palindrome(char array[],int length);
int main()
{
    char string[85],*pointer;
    int position,length,temp,string_length,pesky;
    printf("enter a string\n");
    while(gets(string)){
        position=1,length=2;
        temp=string_length=pesky=strlen(string);
        while(position<=string_length){
            while(length<=temp){
                pointer=substring(string,position,length);
                if(is_palindrome(pointer,length)==1){pesky++;puts(pointer);}
                free(pointer);
                length++;
            }
            position++;
            temp--;
            length=2;
        }
        printf("The string '%s' contains %d palindromes.\n",string,pesky);
    }
    return 0;
}
char* substring(char *string,int position,int length)
{
    char *pointer;
    int c;
    pointer=malloc(length+1);
    if(pointer==NULL){
        printf("unable to locate memory.\n");
        exit(EXIT_FAILURE);
    }
    for(c=0;c<position-1;c++){
        string++;
    }
    for(c=0;c<length;c++){
        *(pointer+c)=*string;
        string++;
    }
    *(pointer+c)='\0';
    return pointer;
}
int is_palindrome(char array[],int length)
{
    int k,j,o=0;
    for(k=length-1,j=0;k>j;k--,j++){
        if(array[k]!=array[j]){
        o=1;
        break;
        }
    }
    if (o==0) {return 1;}
    else {return 0;}
}
4

1 回答 1

0

为了存储各种子字符串,您需要一个 char 指针数组。当您分离出要复制到分配内存区域的子字符串时,您获取返回的指针并将指针存储到您的 char 指针数组中。

所以像下面这样的东西将定义一个字符数组以及当前在数组中的字符指针的数量。

char *pArrayStrings [100];
int   iArrayStringsIndex = 0;

此时,您将拥有一个 char 指针数组。然后,您可以在数组中进行搜索以确定是否已经找到回文。类似于以下内容。

{
    int iLoop = 0;
    // search the array to see if this palindrome is already there
    for (iLoop = 0; iLoop < iArrayStringsIndex; iLoop++) {
        if (strcmp (pArrayStrings[iLoop], pointer) == 0) {
            // found a match for this palindrome
            break;
        }
    }
    if (iLoop >= iArrayStringsIndex) {
       // this is a new palindrome that is not in the array
       pArrayStrings[iArrayStringsIndex] = pointer;
       iArrayStringsIndex++;
    }
}

上述strcmp()函数区分大小写,因此您可能希望使用不区分大小写的比较。

我没有尝试编译此代码,因此其中可能存在错误,但这将是一种通用方法,可以让您接近您想要的。

完成后,您可以遍历数组并执行 afree()以释放分配的内存。

于 2012-08-07T18:22:01.463 回答