int main(void)
{
char u[12], v[12], w[12];
int i;
srand(time(NULL));
for(i = 0; i < 12; i++) {
u[i] = rand() % 95 + 33;
}
u[i] = '\0';
strcpy(v, u);
strncpy(w, u, 5);
w[5] = '\0';
return 0;
}
所以我写了上面的代码。我现在的问题是,运行
strcpy(v, u)
后,u 由于某种原因被完全清除。我对 C 很陌生,所以我不知道如何解决这个问题。
尝试在多个网站上研究我的问题,但没有找到任何解决方案。
每当我检查问题时,我通常做的第一件事就是编译程序并检查编译器日志是否有任何警告。 添加必要的“#include”指令后,我编译了您的代码示例。 在编译器日志中,以下警告提供了有关添加到您的问题的好评论中所记录内容的线索。
/home/craig/C_Programs/Console/RandomChar/main.c|15|warning: array subscript 12 is above array bounds of ‘char[12]’ [-Warray-bounds]|
如上所述,这很可能是您在运行程序时会发生某种类型的未定义行为的第一个线索。
考虑到这一点,以下是程序的重构版本,用于解决超出字符数组边界的问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define SIZE 12
int main()
{
char u[SIZE], v[SIZE], w[SIZE];
int i;
srand(time(NULL));
for(i = 0; i < (SIZE - 1); i++) {
u[i] = rand() % 95 + 33;
}
u[SIZE - 1] = '\0';
strcpy(v, u);
strncpy(w, u, 5);
w[5] = '\0';
printf("u: %s v: %s w: %s\n", u, v, w); /* See the results */
return 0;
}
重构的一些注意事项。 首先,我使用“#define”指令来减少程序中硬编码或“魔术”数字的使用。 接下来,由于要使用的随机字符的最终数量是五个字符,因此我只是确保在生成包含随机字符的字符串时不超过字符串长度边界。 接下来是重构代码的几次测试运行。
craig@Vera:~/C_Programs/Console/RandomChar/bin/Release$ ./RandomChar
u: }E{]oLHWv(( v: }E{]oLHWv(( w: }E{]o
craig@Vera:~/C_Programs/Console/RandomChar/bin/Release$ ./RandomChar
u: o9haex5`q{n v: o9haex5`q{n w: o9hae
这样做的主要收获是始终检查编译器日志中是否有警告,因为它们可能指示可能的未定义行为,并在为变量的大小分配足够的内存时保持谨慎。