6

我创建的一个简单函数遇到了一个特殊问题。此函数生成一个介于 0-14 之间的随机数,然后使用该随机生成的数字作为大小创建一个数组,并用 char 'x' 填充它。

我遇到的问题是,当我调用该函数时,它会在 x 之后随机显示符号或数字。

我最初将数组声明为大小 15,但认为是剩余的插槽导致了此显示问题。但是,更改功能后仍然存在。

这是我正在使用的当前功能:

void application()
{
    int randSize, i;

    srand((unsigned)time(NULL));
    randSize = (rand() % 15);

    char array[randSize];
    char *bar = array;

    for(i=0; i< randSize; i++)
            array[i] = 'x';

    printf("%s | ", bar);
}
4

5 回答 5

6

你不需要用\0C 来结束你的字符串吗?) 例如:

char array[randSize + 1];
for (i=0; i < randSize; i++)
   array[i] = 'x';
array[i] = '\0';

(更新此内容是因为您确实可能想要获得 randSize 长度字符串的有用部分)。

于 2012-10-01T15:59:17.040 回答
2
printf("%s | ", bar);

转换需要一个指向以 0 结尾的字符数组的%s指针,但您的数组不是以 0 结尾的。因此行为是未定义的,但通常发生的是printf继续读取和打印字符,直到找到 0 字节或到达禁止的内存,从而导致分段错误,以先发生者为准。

于 2012-10-01T15:59:35.360 回答
2

%s需要一个指向以null 结尾的字符串的指针。你没有提供那个,所以你有未定义的行为并且你的程序格式不正确。

阅读格式化手册printf以了解其工作原理和预期。事实上,对您在代码中使用的每个库函数执行此操作。做你不应该做的事情然后想知道为什么它不起作用是没有意义的;所有好的库都会提供对其要求的具体描述。

于 2012-10-01T16:00:11.397 回答
1

您正在使用printf打印 C 字符串。C 字符串必须以空字符结尾。

如果要array用作字符串,则需要分配一个附加字符,并将 a 附加\0到末尾:

char array[randSize + 1];

// loop to fill the array

array[i] = '\0';

由于printf需要一个以 null 结尾的字符串,否则它将继续打印超出数组的边界,读取不属于数组的内存。

于 2012-10-01T15:59:29.683 回答
1

除非声明为 const,否则如何使用变量进行编译?这是 C99 的一个旧功能,不被视为标准。在此之前不允许在 C 中使用,并且在 C++ 中也不起作用

char array[randSize];

正确的方法是

char *array = malloc(randSize);

我在这里错过了什么吗?

于 2012-10-01T17:11:20.617 回答