【问题标题】:Converting a const char* to char* at compile-time在编译时将 const char* 转换为 char*
【发布时间】:2021-10-31 11:05:18
【问题描述】:

在我的项目中,我需要用户输入一个字符串,输入的字符串默认为const char*(带引号)。在我的项目中,我还需要修改这些字符串,所以我不能真正使用const

所以我考虑将const char* 转换为char* 具有以下功能:

不是 100% 确定这是问题所在(因为它对我来说崩溃了),但我认为问题在于 New 字符串没有足够的内存来存储整个字符串。我试着通过这样写来分配它的内存:

const char* szOldString = "Test";
char* szNewString[0x1024];
noconst(&szOldString, &szNewString, 5);

考虑到我的参数和 constexpr,这也不起作用。


我想知道是否有人知道我可以使用什么很酷的技巧来完成这项工作。我已经为此工作了一段时间,所以解决方案可能是一个显而易见的解决方案,我只是看不到它。如果是这样,我的错:D

【问题讨论】:

  • 您不能在编译时真正修改实际内存,即使您确实使用了足够大的实际缓冲区。您要解决的实际编译时问题是什么?
  • 我想你的意思是(*New)[i] = (*Old)[i]。不是*New[i] = *Old[i]
  • “编译时解密”,表示加密后的内容会以明文形式出现在可执行文件中。
  • 这在很多不同的层面都有很多错误,我只是不知道从哪里开始。
  • 在你的函数中,你认为 *New[i] = *Old[i]" 有什么作用?试试 "(*New)[i] = (*Old)[i]"。在主要部分,你认为“New = 0x1024”是做什么的?也许是“New[0x1024]”?你认为“0x1024”是什么意思?不是1k。为什么调用 Size=4 的函数?您不想复制字符串结尾字符吗?当您甚至不了解哪些库函数已经可用于复制数据、指针是什么、*x[i] 语法意味着什么、内存分配是什么、“0x”表示法意味着什么时,为什么还要寻找“酷黑客” , 什么 ... ?关于这个问题的一切都只是wr

标签: c++ constants constexpr compile-time


【解决方案1】:

更简单的方法是使用函数strncpy(比只使用strcpy 更安全)。

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
  //char oldString[]= "Hello World!";
  const char* oldString = "Hello World!";
  char newString[40];

  /* copy to sized buffer (overflow safe): */
  strncpy ( newString, oldString, sizeof(newString) );

  cout << newString;  

    return 0;
}

另一种方法是为您希望复制字符串的位置分配 malloc 空间。
之后,您可以随意修改它。

【讨论】:

  • overflow safe 和最古老的问题,strncpy 是,但 cout &lt;&lt; newString 不是:/
  • 这是我会做的,但我必须在 constexpr 中这样做,它不允许我使用这样的函数
  • 这里用strncpy代替strcpy没有任何好处;目标数组显然足够大。如果不是这样,strncpy 的这种使用将不是“溢出安全的”。仔细阅读strncpy 的文档。或者只是尝试一下:将newString 变小,看看会发生什么。传递长度不会自动使函数“更安全”。
  • 为什么是string.h?这又如何解决 OP 的原始问题?
  • @PeteBecker,我只是给他提供一个基本的例子。另外,在 strcat、strcpy 和 strncpy 之间,我更喜欢 strncpy。 strncpy 的问题是当您不在目的地的每种情况下都提供空终止时。还有另一种选择是使用 strlcpy。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2012-01-16
相关资源
最近更新 更多