c - C - Memncpy/Strncpy(也尝试过 strncat)复制的字符少于应有的 1 个字符,不胜感激
问题描述
就像我说的那样, memncpy() (在 main 的中间)复制的字符比它应该少了 1 个字符,不知道为什么。我添加了评论和图片以使其更易于理解。
#define BIT_AMOUNT 4
char * randomBinaryGenerator(char * random){
int randomNum, i;
char temp;
char * tempPtr = (char *)malloc(1 * sizeof(char));
for(i = 0; i <= BIT_AMOUNT - 1; i++){
randomNum = rand() % 2;
temp = randomNum + '0';
tempPtr = NULL;
tempPtr = &temp;
strcat(random, tempPtr);
}
return random;
}
int main(){
srand(time(0));
char str_bin_bitKey[BIT_AMOUNT] = "";
char * random = (char *)malloc(BIT_AMOUNT * sizeof(char));
char * bin_bitKey = (char *)malloc(BIT_AMOUNT * sizeof(char));
printf("\nSize of str_bin_bitKey: %ld, Size of bin_bitKey: %ld\n", sizeof(str_bin_bitKey), sizeof(bin_bitKey));
bin_bitKey = randomBinaryGenerator(random); //generates 4 bit long binary number
memcpy(str_bin_bitKey, bin_bitKey, BIT_AMOUNT);//copies 1 character less
printf("\nbin_bitKey: %s\n", bin_bitKey); //4 bits
printf("\nstr_bin_bitKey: %s\n", str_bin_bitKey);//3 bits???
long long dec_bitKey = 0;//unimportant for now .... convertBinaryToDecimal(bin_bitKey);
printf("\ndec_bitKey: %lld\n\n", dec_bitKey);
free(random);
return 0;
}
这就是输出的样子,你可以看到 str_bin_bitKey 是 3 个字符而不是 4 个:
我感谢所有的帮助。
解决方案
几个问题...
在main
中,数组/指针的大小需要允许 nul 终止符,因此它们需要是BIT_AMOUNT + 1
在中main
,您memcpy
不会复制 nul 终止符。改为使用。strcpy
添加起始 nul 最容易使用(例如):
*random = 0;
不要强制转换malloc
:我会强制转换 malloc 的结果吗?
sizeof(char)
始终为1(根据定义),不管实际的、依赖于架构的大小(例如实际上是 16 位)。char
所以,不要使用sizeof(char)
在randomBinaryGenerator
,tempPtr
泄漏内存。不需要malloc
[甚至根本不需要tempPtr
]。改为使用char temp[2];
。
sizeof(bit_bitKey
) 总是不变的,因为它是指针的大小,而不是它指向的大小(即它不是 BIT_AMOUNT
)。
randomBinaryGenerator
几乎需要彻底的返工。
这是您的代码的注释和固定版本。我已经添加:
#if 0
// old/original code
#else
// new/fixed code
#endif
以帮助显示更改。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define BIT_AMOUNT 4
char *
randomBinaryGenerator(char *random)
{
int randomNum, i;
#if 0
char temp;
char *tempPtr = malloc(1);
#else
char temp[2];
#endif
#if 1
// add nul terminator
*random = 0;
temp[1] = 0;
#endif
#if 0
for (i = 0; i <= BIT_AMOUNT - 1; i++) {
#else
for (i = 0; i < BIT_AMOUNT; i++) {
#endif
randomNum = rand() % 2;
#if 0
temp = randomNum + '0';
tempPtr = NULL;
tempPtr = &temp;
strcat(random, tempPtr);
#else
temp[0] = randomNum + '0';
strcat(random, temp);
#endif
}
return random;
}
int
main(void)
{
srand(time(0));
// NOTE/BUG: need space for EOS terminator
#if 0
char str_bin_bitKey[BIT_AMOUNT] = "";
char *random = malloc(BIT_AMOUNT);
char *bin_bitKey = malloc(BIT_AMOUNT);
#else
char str_bin_bitKey[BIT_AMOUNT + 1] = "";
char *random = malloc(BIT_AMOUNT + 1);
char *bin_bitKey = malloc(BIT_AMOUNT + 1);
#endif
// NOTE/BUG: sizeof(bit_bitKey) is the size of the _pointer_ and _not_ what
// it points to (i.e. it is _not_ BIT_AMOUNT)
#if 0
printf("\nSize of str_bin_bitKey: %ld, Size of bin_bitKey: %ld\n",
sizeof(str_bin_bitKey), sizeof(bin_bitKey));
#endif
// generates 4 bit long binary number
bin_bitKey = randomBinaryGenerator(random);
// copies 1 character less
#if 0
memcpy(str_bin_bitKey, bin_bitKey, BIT_AMOUNT);
#else
strcpy(str_bin_bitKey, bin_bitKey);
#endif
// 4 bits
printf("\nbin_bitKey: %s\n", bin_bitKey);
// 3 bits???
printf("\nstr_bin_bitKey: %s\n", str_bin_bitKey);
// unimportant for now .... convertBinaryToDecimal(bin_bitKey);
long long dec_bitKey = 0;
printf("\ndec_bitKey: %lld\n\n", dec_bitKey);
free(random);
return 0;
}
这是一个清理和改进的版本。请注意,根本不使用它randomBinaryGenerator
会更快/更好。strcat
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define BIT_AMOUNT 4
char *
randomBinaryGenerator(char *random)
{
int randomNum, i;
for (i = 0; i < BIT_AMOUNT; i++) {
randomNum = rand() % 2;
random[i] = randomNum + '0';
}
// add nul terminator
random[i] = 0;
return random;
}
int
main(void)
{
srand(time(0));
char str_bin_bitKey[BIT_AMOUNT + 1];
char *random = malloc(BIT_AMOUNT + 1);
char *bin_bitKey = malloc(BIT_AMOUNT + 1);
// generates 4 bit long binary number
bin_bitKey = randomBinaryGenerator(random);
strcpy(str_bin_bitKey, bin_bitKey);
// 4 bits
printf("\nbin_bitKey: '%s'\n", bin_bitKey);
// 3 bits???
printf("\nstr_bin_bitKey: '%s'\n", str_bin_bitKey);
// unimportant for now .... convertBinaryToDecimal(bin_bitKey);
long long dec_bitKey = 0;
printf("\ndec_bitKey: %lld\n\n", dec_bitKey);
free(random);
return 0;
}
推荐阅读
- javascript - 如何使用 d3 或常规 javascript 标记一个特定的散点(不是所有点)?
- regex - Perl MongoDB API - 过滤器中的正则表达式
- angular - Angular组件如何嵌套无序列表
- 段内
?
- ios - 使用 evaluateJavascript 从 WKWebView 获取 HTML,然后将其存储在变量中(使用 Swift)
- git - 我应该关注我的 git 日志上的未知作者吗?
- javascript - StoreEnhancer 的 TypeScript 定义阻止了剩余参数
- java - JAVA:设置 A 的数据不会显示,因为我的三个存储过程无法被调用
- python - XOR MULTILAYER PERCEPTRON:如何将训练数据的子集作为参数传递以获得预测值
- git - Jenkins 管道检索 Git 分支和哈希
- sql-server - SQL 按列计数记录(数据点)