-1
#include<stdio.h>
#include<conio.h>
#include<string.h>
char *createP(int);
int main()
{
    int n,i;
    char str[100];
    printf("int n = ");
    scanf("%d",&n);
    printf("string str = ");
    scanf("%s",&str);
    if(n>40)
            return -1;
    for(i=0;i<strlen(str);i++)
        if(str[i]=='X' || str[i]=='Y' || str[i]=='Z')
            continue;
            else
             return -1;
    char *P;
    P=createP(n);
    printf("The generated string is = %s",P);
    return 0;
}
char *createP(int n)
{
    if(n==0)
            return "X";
    if(n==1)
        return "Y";
    if(n==2)
        return "Z";
    if(n>2)
        return strcat(createP(n-2),createP(n-3));
}

次の質問の文字列を作成しようとしています:

P(0)='X'

P(1)='Y'

P(2)='Z'

P(n)= P(n-2)+ P(n-3)、n> 2ここで、+は文字列の連結を示します。この問題に再帰(非常に明白に見えます)を使用していますが、.exeが機能していません。

4

3 に答える 3

2

strcatを誤って使用しています。

char * strcat(char *宛先、const char *ソース);

ソース文字列のコピーを宛先文字列に追加します。宛先の終了ヌル文字はソースの最初の文字で上書きされ、宛先の両方の連結によって形成された新しい文字列の最後にヌル文字が含まれます。

代わりにこのようなものを使用してみてください、

char *createP(int n)
{
    if(n==0)
            return "X";
    if(n==1)
            return "Y";
    if(n==2)
            return "Z";
    if(n>2)
    {   
    
            char *P = calloc (n, sizeof(char));
            strcat(P, createP(n-2));
            strcat(P, createP(n-3));
            return P;
    }   
}
于 2013-01-26T07:43:52.620 に答える
0

動的リストを作成する必要がありますが、char *Pそれを文字列として使用させないでください。

を宣言してみてchar P[100]、再帰の最後に\0charを入れてください。

編集:

そんな感じ:

void createP(int n,int index)
{
    if(n==0)
            P[index] = "X";
            return ;

    if(n>2)
        return strcat(createP(n-2,index + 2),createP(n-3,index + 3));
}

Pはグローバル文字列であり、インデックスは0から始まります。

于 2013-01-26T07:25:13.157 に答える
-1

メモリが正しく割り当てられていませんでした。宣言したときに同じ問題が発生しました

type array[20];

と呼ばれるよりarray[20]=...;

解決策は、宣言する必要があるということでしたtype array[21];

于 2016-11-02T00:37:08.983 に答える