我在创建一个简单的函数时遇到了一个奇怪的问题。此函数生成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);
}
答案 0 :(得分:6)
您是否需要在C中使用\0
结束字符串? )例如:
char array[randSize + 1];
for (i=0; i < randSize; i++)
array[i] = 'x';
array[i] = '\0';
(更新此内容是因为您确实希望获得 randSize
长度字符串的有用部分。
答案 1 :(得分:2)
printf("%s | ", bar);
%s
转换需要一个指向0终止字符数组的指针,但您的数组不是以0结尾的。因此行为是未定义的,但通常发生的是printf
继续读取和打印字符,直到它找到0字节或达到禁止内存,从而导致分段错误,以先发生者为准。
答案 2 :(得分:2)
%s
需要一个指向以null结尾的字符串的指针。您没有提供,因此您有未定义的行为并且您的程序格式不正确。
阅读格式化的manual for printf
,了解它的工作原理和预期结果。实际上,为您在代码中使用的每个库函数执行此操作。没有必要做你不应该做的事情,然后想知道为什么它不起作用;所有好的图书馆都会提供他们要求的具体描述。
答案 3 :(得分:1)
您正在使用printf
来打印C字符串。 C字符串必须以空值终止。
如果您想将array
用作字符串,则需要分配一个额外的字符,并在末尾添加\0
:
char array[randSize + 1];
// loop to fill the array
array[i] = '\0';
由于printf
需要一个以空字符结尾的字符串,否则它将继续打印超出数组的边界,读取不属于数组的内存。
答案 4 :(得分:1)
除非将其声明为const,否则如何使用变量进行编译?这是C99的旧功能,不被视为标准配置。之前不允许在C中使用,也不能在C ++中工作
char array[randSize];
正确的方法是
char *array = malloc(randSize);
我在这里错过了什么吗?