在C语言中打印字符数组

6
我创建了一个简单的函数,但是遇到了一个奇怪的问题。该函数会生成一个介于0-14之间的随机数,然后使用该随机数作为数组的大小并用字符'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);
}
5个回答

7
在C语言中,您需要用\0来结束字符串吗?例如:
char array[randSize + 1];
for (i=0; i < randSize; i++)
   array[i] = 'x';
array[i] = '\0';

(更新了此内容,因为您确实可能希望获取长度为randSize的字符串的有用部分。)

(这是因为您可能想要获取指定长度的字符串的一部分。)


3
printf("%s | ", bar);
%s转换需要一个指向以0结尾的字符数组的指针,但是您的数组没有以0结尾。因此行为是未定义的,但通常发生的情况是printf继续读取和打印字符,直到找到0字节或达到禁止访问的内存,先发生哪个就导致了一个分段错误。

2
你正在使用printf打印C字符串。C字符串必须以空字符结尾。
如果你想使用array作为字符串,你需要额外分配一个字符,并在末尾添加\0
char array[randSize + 1];

// loop to fill the array

array[i] = '\0';

由于printf需要一个以空字符结尾的字符串,如果没有这个字符,它将会继续打印超出您数组范围的内容,读取不属于您数组的内存。


2

%s 需要一个指向以null结尾的字符串的指针。你没有提供这个,所以你的程序行为是未定义的,程序也不符合规范。

阅读格式化printf手册,了解它的工作原理和期望。实际上,在你的代码中使用的每个库函数都应该这样做。没有必要做一些你不应该做的事情,然后想知道为什么它不起作用;所有好的库都会提供对它们要求的详细说明。


1
这个变量怎么能编译通过,除非它被声明为const?这是C99的一个旧特性,不被认为是标准。在此之前的C版本中是不允许的,在C++中也不起作用。
char array[randSize];

正确的方式是:

char *array = malloc(randSize);

我在这里漏掉了什么吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接