【问题标题】:C++: strcpy non-ascii characters problem is possible? [closed]C ++:strcpy非ascii字符问题可能吗? [关闭]
【发布时间】:2020-09-01 01:33:59
【问题描述】:

我正在尝试在我的以下代码中创建一个特定的问题案例;

std::string id = "123456789123456789" // it can be different sized string too.
std::string my_id = "TEST_" + id;
char* temp_my_id = (char *) my_id.c_str();
strcpy(temp_my_id, my_id.c_str());
PRINT("my_id value : ", temp_my_id);

这是我项目中的遗留代码,我怀疑 temp_my_id 返回非 ascii 字符。这可能吗?

【问题讨论】:

  • 你能解释一下问题是什么,你想在这里做什么?您正在将字符串的内容复制到自身?为什么以及实际问题是什么?
  • 来自docs for strcpy“字符串不能重叠”
  • 另外,你正在抛弃 const-ness。对于所有这些实际问题,我认为我们不需要考虑关于“非 ASCII”字符的假设问题。
  • strcpy(temp_my_id, my_id.c_str()) temp_my_idmy_id.c_str() 指向同一个内存缓冲区。正如@Ackdari 所说,这是一个错误。
  • 其实没有问题。这是关于一个问题的可能性。我想知道如果我不对代码进行任何修改,它是否可以返回非 ascii 字符。

标签: c++


【解决方案1】:
char* temp_my_id = (char *) my_id.c_str();
strcpy(temp_my_id, my_id.c_str());

源和目标不能在strcpy 中具有相同的内存位置,因为两个参数都标记为restrict

大胆的测试是我的:

restrict 是一个关键字(在 C 中,而不是在 C++ 中),可以在指针声明中使用。经过 添加此类型限定符,程序员向编译器提示 对于指针的生命周期,只有指针本身或值 直接派生出来的(比如指针+1)会被用来访问 它指向的对象。

你可以试试

char a[] = "123";
char *b = a;

strcpy(b, b);

返回:

warning: ‘strcpy’ source argument is the same as destination [-Wrestrict]

同样在 C 中,在 C++ 中它也被破坏了,因为源和目标不能重叠。

【讨论】:

  • 这并不是对操作员关于“非 ascii”字符的问题的真正回答,但是......好点!
【解决方案2】:

strcpy 并不真正关心编码,它会复制直到找到一个 NULL 字节。所以你只需要小心

  • 源以零字节结尾,中间不包含任何字节
  • 源不长于目标
  • 源和目标不应重叠

strcpy vs. memcpyhttp://www.cplusplus.com/reference/cstring/strcpy/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2017-04-21
    • 1970-01-01
    • 2013-02-23
    • 2011-10-03
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多