繁体   English   中英

如何将分配的字符串复制到 C 中的另一个字符串中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM