Fibonacci字母

tgabmvqs  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(66)

我正在为大学提供的一个案例编程。这是关于制作斐波那契函数的,但对于字母。例如,如果f(0)-> af(1)-> b,那么f(2)-> ba,等等。我在完成一半时发现了一个我无法解决的问题。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

void fib(char bank[][700], char result[700], int n) {
    char temp[700];
    for (int i = 2; i <= n; i++) {
        if (i > 2) {
            strcpy(bank[i - 1], result);
        }
        for (int k = 0; bank[i - 1][k] != 0; k++) {
            result[k] = bank[i - 1][k];
        }
        strcat(result, bank[i - 2]);
    }
}

int main() {
    int cases = 0;
    scanf("%d", &cases);
    getchar();
    
    for (int i = 1; i <= cases; i++) {
        int n = 0; char first[5] = {};
        char wordBank[][700] = {{},{}};
        char result[700] = "#";
        scanf("%d %c %c", &n, &first[0], &first[1]);
        getchar();
        wordBank[0][0] = first[0];
        wordBank[1][0] = first[1];
        
        if (n == 0) {
            printf("Case #%d: %c\n", i, first[0]);
        } else if (n == 1) {
            printf("Case #%d: %c\n", i, first[1]);
        } else if (n > 1) {
            fib(wordBank, result, n);
            printf("Case #%d: %s\n", i, result);
        }
    }
    
    return 0;
}

字符串
因此,示例输入是:

3
2 a b
3 a b
4 a b


第1行的3是测试用例的数量,
第2行上的2f(n)的结果,
f(0)f(1)中的线2上的ab
输出将是:

Case #1: ba
Case #2: bab
Case #3: babba


当我尝试输入n超过3时,问题就出现了。我尝试使用usleep函数来减慢这个过程,因为我认为这就是问题的根源。usleep只能帮助我,直到更多的n范围。
f(0)f(1)保证为1个字母,因此对于f(0)f(1),它不能是'ab',或者对于f(0)f(1),它不能是任何其他超过1个字母的组合。

xytpbqjk

xytpbqjk1#

char wordBank[][700] = {{},{}};将wordBank定义为只有两个数组的数组,每个数组700个字符(所有1400个字符都是'\0')。
尝试定义更大的数组

char wordBank[100][700] = {0};

字符串
请参阅https://ideone.com/W9guSZ

23c0lvtd

23c0lvtd2#

对于初学者来说,这个标题:

#include <unistd.h>

字符串
是多余的,因为头文件中的两个声明都没有在程序中使用。
不带参数的函数main应声明为:

int main( void )


使用函数getchar,例如这一行:

scanf("%d", &cases); getchar();


也是多余的。您应该删除getchar的调用。
不清楚为什么在程序中使用幻数700
在函数中,数组temp

char temp[700];


没有使用。
声明数组wordBank

char wordBank[][700] = {{},{}};


只有两个元素。但在函数中,由于循环,可以访问数组外部的内存:

for(int i = 2; i <= n; i++){
    if(i > 2){
        strcpy(bank[i - 1], result);
    }
    for(int k = 0; bank[i - 1][k] != 0; k++){
        result[k] = bank[i - 1][k];
    }
    strcat(result, bank[i - 2]);
}


n大于2时,会导致未定义的行为。
根据赋值,函数应该构建一个新的字符串。
它应该声明为:

char * fib( size_t n, char c1, char c2 );


使用任意两个初始字符。函数的调用者应该将字符传递给函数。
我将按照下面的演示程序中所示的方式定义函数:

#include <stdio.h>
#include <string.h>

char * fib( size_t n, char c1, char c2 )
{
    size_t first = 0;
    size_t second = 1;

    size_t length = 1;

    for (size_t i = 0; i < n; i++)
    {
        length += first;
        second += first;
        first = second - first;
    }

    char *result = calloc( length + 1, 1 );

    if (result != NULL)
    {
        size_t previous_size = 0;
        size_t next_size = 0;

        char *p = result;

        size_t i = 0;

        do
        {
            switch (i)
            {
            case 0:
                *p = c1;
                break;

            case 1:
                *p = c2;
                break;

            case 2:
                *p++ = c2;
                *p++ = c1;
                next_size = 1;
                previous_size = 1;
                break;

            case 3:
                *p++ = c2;
                break;

            default:
                memcpy( p, result, previous_size );
                p += previous_size;
                break;
            }

            next_size += previous_size;
            previous_size = next_size - previous_size;
        } while ( i++ < n);
    }

    return result;
}

int main( void )
{
    const size_t N = 10;

    for (size_t i = 0; i < N; i++)
    {
        char *s = fib( i, 'a', 'b');
        if ( s != NULL ) puts( s );
        free( s );
    }
}


程序输出为:

a
b
ba
bab
babba
babbabab
babbababbabba
babbababbabbababbabab
babbababbabbababbababbabbababbabba
babbababbabbababbababbabbababbabbababbababbabbababbabab

相关问题