编译其中包含空终止符的char数组

时间:2011-12-10 23:48:44

标签: c string

我正在尝试制作一个小型C实用程序,它从文件中读取MP3标签并显示它。我试图让它尽可能高效,所以我正在制作所有存储歌曲动态名称,标题等的字符数组,因此它们在运行时的大小。我通过MP3 ID3标题找到每个'帧'的大小(一个帧是:名称,标题等)。

我首先从歌曲的标题开始。我使用fopen操作加载并放入char缓冲区的MP3文件缓冲区对于标题看起来像这样:

T|0|I|0|T|0|I|0|l|0|E, 

当然都是十六进制的。正如您所看到的,标题字母之间有0个,因此在C中,这意味着在尝试存储char数组时会出现字符串终止符。

我正在尝试以下内容:

memcpy( bBuffFirstFrame, &bBuffTag[0x0A+10], iFrameSize );

其中bBuffTag是所有ID3标题信息所在的位置。

阅读文档,它说memcpy应该存储原始缓冲区中的所有内容,包括空终止符。但是,我正在创建的char数组(bBuffFirstFrame)仅存储第一个字节,并因null终止符而终止。因此,它不存储歌曲名称“N | 0 | A | 0 | M | 0 | E”(0为空),而是仅存储N.

bBuffFirstFrame被定义为:

bBuffFirstFrame = ( unsigned char* ) malloc( iFrameSize );

所以我的第一个问题是,这是解决这个问题的最好方法吗?我应该使用malloc来创建动态数组,还是应该创建一个对于每个帧都非常大的数组?例如:

bBuffFirstFrame[10000]? 

正如您可能知道的那样,歌曲标题随每个MP3而变化。我不想创建预定义大小数组的另一个原因是它可能会导致一个真正的大歌名称的缓冲区溢出。

最后一个问题,有没有办法在char数组中存储null终止符而不终止字符串?

对不起,如果这听起来很混乱。谢谢!

2 个答案:

答案 0 :(得分:2)

空终结符只会被字符串函数所尊重,所以如果你知道你正在阅读的字符串的大小等等,你应该没问题 - 你确定你使用的是memcpy而不是strcpy吗?我知道,鉴于你发布了什么,这听起来很愚蠢,但是memcpy不应该停留在null终结符上。

我建议iFrameSize实际上没有保留你期望的价值,这就是问题的来源


答案 1 :(得分:1)

您可以将喜欢的数据存储在C数组中。问题是许多在字符串上迭代操作的C运行时函数将数组中的第一个'\0'识别为终止字符。