1

假设我有一个文件。我将所有字节读入一个无符号字符缓冲区。从那里我试图在不知道它的长度的情况下读取 ac 字符串(以空结尾)。

我尝试了以下方法:

char* Stream::ReadCString()
{
    char str[0x10000];
    int len = 0;
    char* pos = (char*)(this->buffer[this->position]);
    while(*pos != 0)
        str[len++] = *pos++;
    this->position += len+ 1;
    return str;
}

我以为我可以在遍历时填充 str 数组中的每个字符,检查字符是否为空终止。这是行不通的。有什么帮助吗?

this->buffer = 字节数组
this->position = 在数组中的位置

有没有其他方法可以做到这一点?我想我可以通过实际缓冲区的地址运行它: str[len++] = *(char*)(this->buffer[this->position++])

更新: 我的新功能:

char* Stream::ReadCString()
{
    this->AdvPosition(strlen((char*)&(this->buffer[this->position])) + 1);
    return (char*)&(this->buffer[this->position]);
}

并调用它:

printf( "String: %s\n", s.ReadCString()); //tried casting to char* as well just outputs blank string

示例文件: 在此处输入图像描述

4

4 回答 4

1

str 是本地 c 字符串。任何指向 str 外部函数的引用指针都是未定义的行为:未定义、未指定和实现定义的行为,它可能会或可能不会导致显着问题。

于 2013-07-23T08:05:00.727 回答
1

检查这个:

#include <cstring>
#include <iostream>

class   A
{
  unsigned char buffer[4096];
  int   position;

public:
  A() : position(0)
  {
    memset(buffer, 0, 4096);
    char        *pos = reinterpret_cast<char*>(&(this->buffer[50]));
    strcpy(pos, "String");
    pos = reinterpret_cast<char*>(&(this->buffer[100]));
    strcpy(pos, "An other string");
  }

   const char *ReadString()
  {
    if (this->position != 4096)
      {
        while (std::isalpha(this->buffer[this->position]) == false && this->position != 4096)
               this->position++;
        if (this->position == 4096)
          return 0;
        void    *tmp = &(this->buffer[this->position]);
        char    *str  = static_cast<char *>(tmp);
        this->position += strlen(str);
        return (str);
      }
    return 0;
  }

};

reintrepret_cast 仅用于初始化,因为您正在从文件中读取

int     main()
{
  A     test;

  std::cout << test.ReadString() << std::endl;
  std::cout << test.ReadString() << std::endl;
  std::cout << test.ReadString() << std::endl;
}

http://ideone.com/LcPdFD

编辑我改变了结尾 ReadString()

于 2013-07-23T08:17:11.093 回答
0

只要您小心,空终止可能是最好的方法,但它不适合您的原因很可能是因为您正在返回已在堆栈上分配的内存。一旦你点击返回,这个内存就会被释放,因此会导致未定义的行为。相反,在堆上分配你的字符:

char* str = new char[0x10000];

并在调用者不再需要时释放内存。

于 2013-07-23T08:07:32.830 回答
0

可以通过以下方法修复。我正在推进职位,然后返回地址。

char* Stream::ReadCString()
{
    u64 str_len = strlen((char*)&(this->buffer[this->position])) + 1;
    this->AdvPosition(str_len);
    return (char*)&(this->buffer[this->position - str_len]);
}

希望这对任何人都有帮助。

于 2013-07-23T08:46:58.110 回答