[英]How to copy a malloced string into another string in C
我有这个随机生成字符串的 function
char *generate_random_string(int seed) {
if (seed != 0) {
srand(seed);
}
char *alpha_num_str =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
char *random_str = malloc(RAND_STR_LEN);
for (int i = 0; i < RAND_STR_LEN; i++) {
random_str[i] = alpha_num_str[rand() % (strlen(alpha_num_str) - 1)];
}
return random_str;
}
我想复制这个 function 的返回值,如果我给它一个种子 '1' 到一个名为initialisation_vector
的字符串中,这就是我目前的做法:
char initialisation_vector[RAND_STR_LEN + 1] = {0};
strcpy(initialisation_vector, generate_random_string(1));
但是,当我运行代码时,我从strcpy
行收到malloc
缓冲区溢出错误。 我做错了什么,如何为此分配足够的 memory ?
主要问题:
字符串为 C 预计为空/零终止。 这意味着一个n
字符串应该分配有n+1
个字节,最后一个应该是'\0'
。
您的代码中的问题是random_str
被分配为恰好包含RAND_STR_LEN
字符,因此错过了 null 终止。
你应该改变:
char *random_str = malloc(RAND_STR_LEN);
for (int i = 0; i < RAND_STR_LEN; i++) {
random_str[i] = alpha_num_str[rand() % (strlen(alpha_num_str) - 1)];
}
至:
/*-------------------------------------vvv--*/
char *random_str = malloc(RAND_STR_LEN + 1);
for (int i = 0; i < RAND_STR_LEN; i++) {
random_str[i] = alpha_num_str[rand() % (strlen(alpha_num_str) - 1)];
}
random_str[RAND_STR_LEN] = '\0'; /* add zero termination */
笔记:
如果你想 select 来自alpha_num_str
中所有可用字符的随机字符,你应该使用: rand() % (strlen(alpha_num_str))
(没有-1
)。 这是因为x % n
将返回0..n-1
的值。
同样出于效率原因,您可以在循环之前计算一次并将其存储在变量中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.