将字符数组传递给函数|奇怪的错误

时间:2012-10-07 00:54:41

标签: c++

基本上我有一个缓冲区,我正在寻找各种标志来从二进制文件格式中读取某些字段。我有文件读入缓冲区但是当我开始编写代码来搜索缓冲区中的标志时,我立刻就碰到了墙。我是一个C ++菜鸟,但这就是我所拥有的:

void FileReader::parseBuffer(char * buffer, int length)
{
  //start by looking for a vrsn
  //Header seek around for a vrns followed by 32 bit size descriptor
  //read 32 bits at a time
  int cursor = 0;
  char vrsn[4] = {'v','r','s','n'};
  cursor = this->searchForMarker(cursor, length, vrsn, buffer);
}

int FileReader::searchForMarker(int startPos, int eof, char marker[], char * buffer)
{
  int cursor = startPos;
  while(cursor < eof) {
    //read ahead 4 bytes from the cursor into a tmpbuffer
    char tmpbuffer[4] = {buffer[cursor], buffer[cursor+1], buffer[cursor+2], buffer[cursor+3]}; 
    if (strcmp(marker, tmpbuffer)) {
      cout << "Found: " << tmpbuffer;
      return cursor;
    }
    else {
      cout << "Didn't Find Value: " << marker << " != " << tmpbuffer;
    }
    cursor = cursor + 4;
  }
}

我的标题如下:

#ifndef __FILEREADER_H_INCLUDED__
#define __FILEREADER_H_INCLUDED__

#include <iostream>
#include <fstream>
#include <sys/stat.h>



class FileReader {
  public:
    FileReader();
    ~FileReader();
    int open(char *);
    int getcode();
  private:
    void parseBuffer(char *, int);
    int searchForMarker(int, int, char[], char *);
    char *buffer;
};

#endif

我希望用strcmp返回vrsn的匹配,但我的结果看起来像这样

Didn't Find Value: vrsn != vrsn
Found: 

看起来它在传递我正在寻找的char数组之后在第二遍找到它。

相关的十六进制代码

hex

3 个答案:

答案 0 :(得分:3)

你的问题有两个方面:

  1. strcmp成功时返回“0”,而不是失败。阅读文档。

  2. strcmp期望以null结尾的字符串。您说您选择了非终止char数组,因为这是您的数据库库使用的数组。好吧,好吧。但是,你仍然违反了strcmp的要求。使用strncmp代替(需要长度参数),或者最好实际编写C ++ 并开始使用std::vector<char>和朋友。

答案 1 :(得分:0)

不应该是int FileReader::searchForMarker(...) { .... }吗?

对于第二个查询,我猜strcmp在有两个以空字符结尾的字符串作为参数时有效。例如str1[]="AAA";str2[]="AAA";,则strcmp()将被用作  if(strcmp(str1,str2)==0)将返回0以表明它们是平等的。在您的情况下,您创建的tmpbuffer不是空终止字符串,除非您最后添加\0。因此,您可能希望在{{{{}}的末尾添加\0 1}}创建一个tmpbuffer的字符串。

答案 2 :(得分:0)

char vrsn[4] = {'v','r','s','n'};

仅包含指定的4个字符。最后没有空格。

 char tmpbuffer[4] = {buffer[cursor], buffer[cursor+1], buffer[cursor+2], buffer[cursor+3]};

仅包含缓冲区中的4个字符。最后没有空格。

最后你打电话:

if (strcmp(marker, tmpbuffer)) {

strcmp()函数希望它的每个参数都以空字符('\ 0')结尾。它希望使用以null结尾的字符串。

由于您的数据不是以null结尾,您可能希望使用memcmp()而不是strcmp()。

此外,strcmp()在其参数相等时返回零,因此if语句中的条件被反转。 (零是假的,其他一切都是真的。)当参数相等时,memcmp()函数也将返回零。