gpt4 book ai didi

c - c 中的 fread() 和 strncpy() 中的空字符

转载 作者:太空宇宙 更新时间:2023-11-04 05:09:59 25 4
gpt4 key购买 nike

总的来说,我是新程序员,现在我已经开始使用 c 语言工作了。我正在尝试解码 IDEv3 mp3 标签,但遇到了各种问题。当我使用 fread() 和 strncpy() 命令时,我注意到两者都需要将\n 字符作为结束引用点。 (也许我错了这只是一个观察)

当我打印输出时,它们会产生一个不可读的字符。作为克服问题的解决方案,我使用 fread() 处理 4 个字节而不是 3 个字节以生成 (8)\n 个字符(整个字节),第二步我使用 strncpy() 处理 3 个字节来分配然后我用于打印的内存。理论上,当我使用 fread() 时,我不应该遇到这个问题。

代码示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct{
unsigned char header_id[3]; /* Unsigned character 3 Bytes (24 bits) */
}mp3_Header;

int main (int argc, char *argv[]) {

mp3_Header first;
unsigned char memory[4];

FILE *file = fopen( name.mp3 , "rb" );

if ( (size_t) fread( (void *) memory , (size_t) 4 , (size_t) 1 , (FILE *) file) !=1 ) {
printf("Could not read the file\n");
exit (0);
} /* End of if condition */

strncpy( (char *) first.header_id , (char *) memory , (size_t) 3);

printf ("This is the header_ID: %s\n", first.header_id);

fclose(file);

} /* End of main */
return 0;

最佳答案

您对 '\n' 终止字符串的观察是不正确的。 C 中的字符串需要以 0 字节 (\0) 结尾。然而,一些函数,如 fgets(),应该从文件中读取行,将行尾的\n 作为终止符。

您的代码的问题是 fread() 准备好二进制数据,并且不会尝试将该数据解释为字符串,这意味着它不会将\0 放在末尾。但是字符串函数,如 strcpy,需要这个 0 字节来识别字符串的结尾。 strncpy 也在复制\0 后停止,但它永远不会将更多字节放入接收字符串以防止缓冲区溢出。所以它会复制你的 3 个字节,但它不会将\0 放在字符串的末尾,如果字符串比长度参数短,它就会这样做。

所以你应该做的是用一个你实际需要的更多元素声明 header_id,并在 strcpy 之后,将这个额外元素设置为\0。像这样:

strncpy( first.header_id , memory , 3);
first.header_id[3] = '\0';

请记住,3 个 header 字节将转到数组元素 0..2,因此元素 3 需要终止符。当然,你需要声明 header_id[4] 来为额外的\0 留出空间。

另请注意,我省略了类型转换 - 如果您的类型无论如何都是正确的,则不需要它们。将数组传递给函数无论如何都会传递指向第一个元素的指针,因此无需将数组 header_id 转换为 strncpy( (char *) first.header_id , (char *) memory , (size_t ) 3);.

关于c - c 中的 fread() 和 strncpy() 中的空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20831239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com