【问题标题】:Argument of type "const char *" is incompatible with parameter of type "char *"“const char *”类型的参数与“char *”类型的参数不兼容
【发布时间】:2019-12-16 05:17:42
【问题描述】:

我正在尝试加入“ip-api.com/json/”并声明字符“ip_address” 但是“ip-api.com/json/”带有红色下划线并表示:

argument of type "const char *" is incompatible with parameter of type "char *"

怎么做?

TCHAR path[_MAX_PATH];
        _tcscpy(path, ip_address);
        _tcscat("ip-api.com/json/", ip_address);

【问题讨论】:

  • 你想在这里做什么? _tcscat("ip-api.com/json/", ip_address); 正在尝试将 ip_address 的内容添加到 "ip-api.com/json/"。你不能那样做。
  • 请记住strcat 函数(以及类似_tcscat 函数的亲属)将其目的地作为第一个参数。还要记住,在 C++ 中,所有文字字符串实际上都是 constant 字符数组。如何连接到常量数组?
  • 是的,ip-api.com/json/ + ip_address。为什么我不能?
  • @prako2 您将如何访问它? "ip-api.com/json/" 是一个字符串文字。你不能“重复使用”它。
  • typedef std::basic_string<TCHAR> TCHARString;。然后,当您使用TCHARString 时,您拥有所有可用于字符串类的操作,例如使用operator +operator += 的连接等,而无需确保有足够的空间、字符串文字问题等。跨度>

标签: c++ char undefined constants string-literals


【解决方案1】:

在本次通话中

_tcscat("ip-api.com/json/", ip_address);

您正在尝试修改字符串文字。

C++ 中的字符串文字具有常量字符数组的类型。因此转换为指针,它们的类型为const char *

您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

此外,您必须保留足够大的内存以将ip_address 指向的字符串附加到字符数组中的另一个字符串。

例如

char address[_MAX_PATH] = "ip-api.com/json/";
_tcscat( address, ip_address);

【讨论】:

  • 谢谢!仍然难以理解,但我得到了我想要的。
  • @prako2 字符串文字通常存储在文字池中。例如,字符串文字“A”和“B”可以存储在池中,如 { 'A', '\0', 'B','\0' }。因此,如果允许更改字符串文字,您将覆盖字符串文字占用的内存。例如这个语句 if ( strcmp( s, "B" ) == 0 ) 将是无效的。字符串文字已经改变了!
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2021-08-06
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多