C - 如何将字符串数组连接到缓冲区?

时间:2016-09-28 05:41:51

标签: c

我试图连接歌曲闪烁的随机数行。在发送之前进入缓冲区,因为我需要计算缓冲区的大小。

我的代码:

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行。

2 个答案:

答案 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