【问题标题】:const char to char problemconst char 到 char 问题
【发布时间】:2011-03-18 18:06:49
【问题描述】:

如何从char 转换为const char?如何在不更改 char SendBuf 的情况下实现类型转换?这是我的代码:

.cpp

// main()    
char SendBuf[6] = "Hello";
sendto(..., SendBuf, ...);

// sendto structure
int sendto(
__in  SOCKET s,
__in  const char *buf,
__in  int len,
__in  int flags,
__in  const struct sockaddr *to,
__in  int tolen
);

错误

Error   1   error C2440: '=' : cannot convert from 'const char [6]' to 'char [6]'

谢谢。

【问题讨论】:

  • 该代码不应产生该错误消息。也许你遗漏了一些相关的东西。
  • 请创建最小的程序,但仍然存在问题,然后将该代码复制并粘贴到您的问题中。请不要重新键入您的代码,而是将确切的文本粘贴进去。在总结和重新键入您的程序时,您遗漏了一个重要的细节。
  • Array Assignment 的可能重复项
  • @Adams 这是我最简单的编码,来自套接字参数的sendto 应该采用什么。我只需要知道我的变量的正确分配。

标签: c++


【解决方案1】:

我没有方便的微软编译器来测试这个理论,但我怀疑 OP 有这样的代码:

int main() {
    char SendBuf[6];
    SendBuf = "Hello";
    // sendto(..., SendBuf, ...);
}

我怀疑他看到的错误 cannot convert from 'const char [6]' to 'char [6]' 发生在 assignment 上,而不是初始化也不是 sendto 调用。

有微软编译器检查的人可以编译上述程序并确认错误信息吗?

【讨论】:

  • 是的,在 Visual C++ 2010 中重现。
【解决方案2】:

这样写作业:

const char *SendBuf = "Hello";

您不必对函数调用做任何事情。 (const char* 参数将char* 变量作为输入。)

【讨论】:

  • 错误在赋值,而不是函数调用。我会更新的。
  • const char 究竟是什么意思?
  • @Chicko:在变量声明中,这意味着它创建了一个常量变量(永远不能写入)。在指针上,这意味着指针是内存的只读视图,但程序的某些其他部分可能仍会更改为指向变量。
  • @divide:我不推荐这个修复,也许他需要在传输之前写入缓冲区。
  • @divide:什么任务?真实代码中的分配,但不在问题中? (你的答案和问题都有initialization,而不是assignment
【解决方案3】:

试试

char SendBuf[6] = { "Hello" };

注意大括号,它告诉编译器您正在初始化一个聚合(在本例中是一个数组)。

然后,而不是

SendBuf = "Hello";

这显然是你的真实代码,使用

strcpy(SendBuf, "Hello");

memcpy(SendBuf, "Hello", 6);

【讨论】:

  • +1:忽略误导性标题和问题解决了编译错误和实际问题;)
  • -1:用字符串初始化char[]是合法的。大括号不会告诉编译器它不知道的任何事情。
  • @Rob:嗯,显然有一些编译器(可能是一些较旧的 Visual C++)有问题......实际上只是尝试了赋值,因为这就是编译器消息所说的,验证了问题,并指出您也猜到了。
  • @Rob:而char[] 是一般规则的一个例外。将大括号括在数组初始值设定项周围是保持一致性的好习惯,即使 char[](仅)特别允许跳过它。
  • @Rob:编辑答案以解决显然是真实代码的问题。
【解决方案4】:

您不能将字符串文字传递给方法是否有原因? sendTo(...,"Hello",...);

如果是,那么为什么不简单地声明 const char* SendBuf = "Hello"; 而不是使用 char 数组作为一种替代方法。

或者也许更好的是开始探索 STL 并使用 std::string SendBuf("Hello"); 并将 SendBuf.c_str() 传递到方法中。

给猫剥皮的方法总是不止一种,只需选择最适合您的刀即可。

【讨论】:

  • 呸。 std::string 并不适合存储网络数据包。而c_str 绝对不是,sendto 在 NUL 终止符的基础上不起作用。
  • 虽然你可能是对的,尽管 OP 只询问了转换和 charconst char 的关系,但我并没有草率地得出使用的结论......重点仍然是最好的使用工作的工具,不管是什么。
猜你喜欢
  • 2013-11-09
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多