为什么这两个字符数组不能正确连接?(C编程)

为什么这两个字符数组不能正确连接?(C编程),c,concatenation,c-strings,strcat,null-character,C,Concatenation,C Strings,Strcat,Null Character,在这里,我只是尝试将两个字符串路径连接在一起,但有时执行此操作时,它无法正常工作。例如,我得到: char *program_working_dir; char backup_dir[9]="/Backups/"; // getting the current working directory program_working_dir = getcwd(NULL, 0); if (program_working_dir == NULL){ printf("

在这里,我只是尝试将两个字符串路径连接在一起,但有时执行此操作时,它无法正常工作。例如,我得到:

char *program_working_dir;
char backup_dir[9]="/Backups/";

// getting the current working directory
program_working_dir = getcwd(NULL, 0);
if (program_working_dir == NULL){
    printf("Failed to get working directory( take_backup function )\n");
    return -1;
}

// allocate memory for full path that contain the current directory and the /Backups/
char *full_backup_dir = (char *)malloc( (strlen(program_working_dir) + strlen(backup_dir) + 1 ) * sizeof(uint8_t) );
if (full_backup_dir == NULL){
    printf("Failed to allocate proper memory to stor full path of backup directory\n");
    return -1;
}

// used for debugging purposes
printf("program working dir%s\n", program_working_dir); // (here : /home/ramixix/Documents/3_grade/2th_Semester/image_processing/Project/image_processing/)
printf("%d\n",  strlen(program_working_dir));  // ( 86 length of program_working_dir )

// try to concatenate the tow string using snprintf. I add 1 to size for '\0' terminate string
snprintf(full_backup_dir, ( strlen(program_working_dir) + strlen(backup_dir) +1  ) * sizeof(uint8_t)  , "%s%s", program_working_dir, backup_dir);
printf("Full path: %s\n", full_backup_dir);
正如您在这里看到的,在连接之后,我得到了有线字符串/��M�这毁了我所有的程序,我不明白为什么会这样。 我还尝试使用strncpy和strncat做同样的事情,因此我替换了行:

program working dir/home/ramixix/Documents/3_grade/2th_Semester/image_processing/Project/image_processing
86
path /home/ramixix/Documents/3_grade/2th_Semester/image_processing/Project/image_processing/Backups/��M�X

还是有同样的问题。我还删除了我添加到full_back_dir大小的1,但是这个程序不想正常运行。在这一点上,我真的非常感谢任何帮助和反馈。请帮忙

这个数组

strcpy(full_backup_dir, program_working_dir);
strcat(full_backup_dir, backup_dir);
不包含字符串,因为它没有足够的空间来存储用作初始值设定项的字符串文字的终止零'\0'

将数组声明为

char backup_dir[9]="/Backups/";
实际上,不需要使用strlen函数计算存储字符串的长度。它等于backup_dir-1的大小

也在这个表达式中

char backup_dir[] = "/Backups/";
操作数sizeofuint8\u t是冗余的,只会混淆代码的读取器

上面的表达式可以这样写

 (strlen(program_working_dir) + strlen(backup_dir) + 1 ) * sizeof(uint8_t)
这个数组

strcpy(full_backup_dir, program_working_dir);
strcat(full_backup_dir, backup_dir);
不包含字符串,因为它没有足够的空间来存储用作初始值设定项的字符串文字的终止零'\0'

将数组声明为

char backup_dir[9]="/Backups/";
实际上,不需要使用strlen函数计算存储字符串的长度。它等于backup_dir-1的大小

也在这个表达式中

char backup_dir[] = "/Backups/";
操作数sizeofuint8\u t是冗余的,只会混淆代码的读取器

上面的表达式可以这样写

 (strlen(program_working_dir) + strlen(backup_dir) + 1 ) * sizeof(uint8_t)

我不确定sizeofuint8是否保证为1。但是正确的表达式应该是sizeofchar,它等于1。因此,您完全正确地删除了sizeofuint8_t,但原因稍有错误。@HAL9000您认为类型char的位数可以小于8位吗?可能吧?不知道。如果有一天我觉得无聊,我可能会仔细阅读标准中的相关部分。但无论如何,malloc需要以字符数表示其参数,strlen也以字符数表示其长度。所以sizeofuint8\u t真的打破了干净的代码rule@HAL9000不,它不会坏。这只会让读者感到困惑。让读者困惑是我打破干净代码规则的意思……我不确定sizeofuint8是否保证为1。但是正确的表达式应该是sizeofchar,它等于1。因此,您完全正确地删除了sizeofuint8_t,但原因稍有错误。@HAL9000您认为类型char的位数可以小于8位吗?可能吧?不知道。如果有一天我觉得无聊,我可能会仔细阅读标准中的相关部分。但无论如何,malloc需要以字符数表示其参数,strlen也以字符数表示其长度。所以sizeofuint8\u t真的打破了干净的代码rule@HAL9000不,它不会坏。这只会让读者感到困惑。让读者困惑是我所说的打破干净代码规则的意思。。。。