这听起来可能有点奇怪,或者问题可能很琐碎,但是在我一生的大部分时间里,我都在用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。从技术上来说,RIFFWAVE并不是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) { // .. }

  • 我个人将使用strncmpmemcmp。他们最终会做同样的事情,但是从语义上来说strncmp是一个字符串比较函数,可以使代码更清晰。

    有关strncmp的信息,请参见here
    有关memcmp的信息,请参见here

    10-08 11:14