c - 随机词生成器中的奇怪输出

标签 c arrays multidimensional-array stdio

我在以下程序的输出中遇到了一些问题。该程序随机生成单词,首先是一个随机辅音,然后是一个随机元音,然后再次生成您想要的最大字母数。

当我在生成后立即打印生成的单词时,它会按预期给我一个单词列表。当我跳出单词生成和堆叠循环,并再次打印单词输出时,我将所有单词混合在一个长链中,这真的很奇怪。怎么了?

#include <stdio.h>

#define MAXWORDS 10
#define MAXLETTERS 6

int lcg(int Xcur)       /*linear congruential generator*/
{
    int A = 445, C = 700001, M = 2097152;
    int Xnext = (A * Xcur + C) % M;
    return Xnext;
}

int main()
{
    int x;
    printf("input seed for linear congruential generator: ");
    scanf("%d",&x);

    char consonants[]="bcdfghjklmnprstvwxz";
    char vowels[]="aeiou";

    int i,j;
    int turn;

    char words[MAXWORDS][MAXLETTERS];

    for(i=0;i<MAXWORDS;i++)
    {
        turn=1;

        for(j=0;j<MAXLETTERS;j++,turn++)
        {
            x=lcg(x);           /* random number generated */

            if(turn%2)          /* one consonant, one vowel, in turn */
                words[i][j]=consonants[x%19];
            else
                words[i][j]=vowels[x%5];
        }

        words[i][j]='\0';

        /* print each word generated */
        printf("word %d: %s\n", i+1, words[i]);
    }

    /* print the first word again */
    printf("\n\nthe 1st word again: %s\n",words[0]);

    return 0;
}

输出:

input seed for linear congruential generator: 23
word 1: wuduca
word 2: navozo
word 3: depiza
word 4: jukiti
word 5: raliwi
word 6: danila
word 7: cexewi
word 8: bamohu
word 9: jiruzi
word 10: temomo


the 1st word again: wuducanavozodepizajukitiraliwidanilacexewibamohujiruzitemomo

最佳答案

这是因为它是以连续的方式存储的,没有任何空字符。

方法一: 如果你只是想正确地打印它,你可以通过写在下面一行来完成:

printf("\n\nthe 1st word again: %s\n",words[0]);

作为

printf("\n\nthe 1st word again: %.*s\n",MAXLETTERS, words[0]);

方法二:

声明单词为

char words[MAXWORDS][MAXLETTERS+1];

并将里面的for循环写成

for(j=0;j<MAXLETTERS;j++,turn++)
{   
    x=lcg(x);           /* random number generated */

    if(turn%2)          /* one consonant, one vowel, in turn */
        words[i][j]=consonants[x%19];
    else
        words[i][j]=vowels[x%5];
}
words[i][MAXLETTERS] = '\0';

关于c - 随机词生成器中的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57920729/

相关文章:

c - 为什么在启用 GCC 优化的情况下,这段代码使用 strlen 的速度要慢 6.5 倍?

PHP - 在数组中搜索字符串

c - 如何在 C 中初始化多维数组?

c++ - 我如何知道 USB 设备是否已在使用中?

c - Readlink 找不到 C 文件 (MSYS)

c - 如何从末尾删除 C 中控制台上打印的当前行?

c++ - c++ 中是否可能存在指向不同类型的指针数组?

c++ - 如何遍历二维 vector ?

python - 使用 numpy.reshape() 反转 skimage view_as_blocks()

二维数组的正确下标排序