我试图连接歌曲闪烁的随机数行。在发送之前进入缓冲区,因为我需要计算缓冲区的大小。
我的代码:
char temp_buffer[10000];
char lyrics_buffer[10000];
char *twinkle[20];
int arr_num;
int i;
twinkle[0] = "Twinkle, twinkle, little star,";
twinkle[1] = "How I wonder what you are!";
twinkle[2] = "Up above the world so high,";
twinkle[3] = "Like a diamond in the sky.";
twinkle[4] = "When the blazing sun is gone,";
twinkle[5] = "When he nothing shines upon,";
srand(time(NULL));
arr_num = rand() % 5;
for (i=0; i<arr_num; i++);
{
sprintf(temp_buffer, "%s\n", twinkle[i]);
strcat(lyrics_buffer, temp_buffer);
}
printf("%s%d\n", lyrics_buffer, arr_num);
即使我的数字大于0,我的当前代码也只打印1行。
答案 0 :(得分:2)
有两个问题:第一个是由BLUEPIXY找到的,而且你的循环永远不会按照你的想法做到。如果您只是使用调试器来逐步执行代码,那么您可以轻松地找到非常。(请在将来首先执行此操作)。
第二个问题是非静态局部变量(如lyrics_buffer
)的内容是不确定。使用这些变量而不进行初始化会导致未定义的行为。发生这种情况的原因是因为strcat
函数查找目标字符串的结尾,并且它通过查找终止'\0'
字符来执行此操作。如果目标字符串的内容不确定,它将会显示随机,终结符可能不在数组中的任何位置。
要初始化数组,您只需执行此操作。
char lyrics_buffer[10000] = { 0 };
这将使编译器将其全部初始化为零,这就是'\0'
的原因。
temp_buffer
不需要此初始化,因为sprintf
无条件地开始在第一个位置写入,它不会以任何方式检查内容。换句话说,它会初始化缓冲区。
答案 1 :(得分:0)
在使用0初始化缓冲区后,在每次打印后更新缓冲区地址。
char temp_buffer[10000] = {0};
for (i=0; i<arr_num; i++) //removed semicolon from here
{
sprintf(temp_buffer + strlen(temp_buffer), "%s\n", twinkle[i]);
}
temp_buffer
应包含最终输出。确保你有足够的缓冲区大小
您不需要strcat