这听起来可能有点奇怪,或者问题可能很琐碎,但是在我一生的大部分时间里,我都在用PHP编程(是的,我知道它的发音)。因此,当我切换到C++时,对我来说有些陌生的事情(由于php习惯)。
因此,我正在使用struct加载wav header 数据。值定义为uint8_t类型:
typedef struct WAV_HEADER
{
uint8_t RIFF[4]; // RIFF
uint8_t WAVE[4]; // WAVE
}
我必须将它们与四个字母的字符串进行比较,例如:
if(wavHeader.RIFF[0] . wavHeader.RIFF[1] . wavHeader.RIFF[2] . wavHeader.RIFF[3] == 'RIFF')
{ do sth }
这应该很容易检查加载的文件是否为Wave文件(* .wav)。谢谢你的帮助。
最佳答案
C和C++中的字符串是null-terminated。从技术上来说,RIFF
和WAVE
并不是C风格的字符串,因为没有空终止符,因此您不能像strcmp
那样直接使用简单的C / C++风格的字符串进行比较。但是,有几种方法可以将它们与所需的字符串进行比较:
if (header.RIFF[0] == 'R' && header.RIFF[1] == 'I' && header.RIFF[2] == 'F' && header.RIFF[3] == 'F') { // .. }
if (strncmp((const char*)header.RIFF, "RIFF", 4) == 0) { // .. }
if (memcmp(header.RIFF, "RIFF", 4) == 0) { // .. }
我个人将使用
strncmp
或memcmp
。他们最终会做同样的事情,但是从语义上来说strncmp
是一个字符串比较函数,可以使代码更清晰。有关
strncmp
的信息,请参见here。有关
memcmp
的信息,请参见here。