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 ポインターの配列が必要です。malloc メモリ領域にコピーしている部分文字列を分離すると、返されたポインタを取得し、そのポインタを char ポインタの配列に格納します。

したがって、次のようなものは、現在配列にある 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()関数は大文字と小文字を区別するため、大文字と小文字を区別しない比較を使用することをお勧めします。

私はこのコードをコンパイルしようとはしていないので、エラーがあるかもしれませんが、これはあなたが望むものに近づけるための一般的なアプローチです.

完了したら、配列をループして aを実行して、割り当てられていfree()ないメモリを解放できます。

于 2012-08-07T18:22:01.463 に答える