用c++编写两个不同类型的变量
Write two variables of different type in c++
我知道这个问题可能看起来有点愚蠢,但我尝试了所有的方法,但不知道如何制作,我试图在消息框中写两种不同的类型,一种是字符串,另一种是这样的字符:
MessageBox(NULL, buffer, "", MB_OK | MB_ICONINFORMATION);
我正在尝试在缓冲区之前添加一个字符串,并尝试
"字符串"+缓冲区
"字符串"<lt;缓冲
但两者都不起作用。感谢所有的回复者都非常感谢
编辑
我真正的问题是,当我试图将其作为字符串并在消息框中显示时,我收到了一个错误,无法从字符串转换为LPCSTR
使用std::string
,一切都会好起来的。我猜buffer
是而不是类型的char
,而是char const *
,不是吗?然后您可以使用+
运算符:
std::string("string") + buffer;
如果MessageBox
采用char const *
参数,则可以使用std::string
的c_str()
成员函数传递字符串:
MessageBox(NULL, (std::string("string") + buffer).c_str(), "", MB_OK | MB_ICONINFORMATION);
在C++中,这些是表示字符串的不同方式。
最简单的是array of characters
。这很简单,速度也很快,但数组没有任何智能,所以很容易覆盖数组的末尾(缓冲区溢出),这非常糟糕。
#include <iostream>
int main()
{
const int nLength = 24;
char szBuff[nLength];
::strcpy(szBuff, "Hello"); // cpy ==> copy
::strcat(szBuff, " World"); // cat ==< concatenate
std::cout << szBuff << "n";
return 0;
}
标准库提供了一个类std::string
。这个类会自动调整自身的大小,使其对错误的适应能力更强。
#include <iostream>
#include <string>
int main()
{
std::string sBuff;
sBuff = "Hello";
sBuff += " World";
std::cout << sBuff << "n";
return 0;
}
当你调用一个函数时,你需要知道它需要什么样的字符串。
如果它需要一个std::string
,而你给它一个数组(const char *
),那没关系,因为std::string
是从char数组自动构造的。
在相反的情况下,函数需要一个数组,但得到一个std::字符串,这将生成编译器错误。幸运的是,std::字符串有一个函数"c_str()
"
int main()
{
std::string sStr = "Hello";
char szArr[24] = "Hello";
funcA(szArr); // OK
funcA(sStr); // OK
funcB(szArr); // OK
funcB(sStr); // Syntax Error
funcB(sStr.c_str()); // OK
return 0;
}
现在,在您的例子中,MessageBox()
将一个字符数组(const char *
)作为其第二个参数,我假设buffer
是一个字符阵列。不能简单地连接两个数组,但必须使用::strcat()
。
void ShowMsg(const char *szMsg)
{
const char *szPrefix = "Error: ";
const int nLen = 256;
char szBuff[nLen];
// make sure buffer is big enough
assert(strlen(szPrefix) + ::strlen(szMsg) < nLen);
::strcpy(szBuff, szPrefix);
::strcat(szBuff, szMsg);
::MessageBox(NULL, szBuff, "", MB_OK | MB_ICONINFORMATION);
}
现在可以像sPrefix + sMsg
一样将两个std::string
加在一起,结果是std::string
。您甚至可以像sPrefix + szMsg
一样将一个数组附加到std::string
,仍然会给出std::字符串。因此,我们的ShowMessage()
函数可以简化。
void ShowMsg(const char *szMsg)
{
std::string sPrefix = "Error: ";
::MessageBox(NULL, (sPrefix + szMsg).c_str(), "",
MB_OK | MB_ICONINFORMATION);
}
现在我们刚刚触及字符串复杂性的表面。我建议你在做得太深入之前,先用一篇好的C++文本近距离地、个人化地学习字符串。
或者作为一个字符字符串(如果缓冲区是一个字符*)
char * Result;
Result = new char (strlen(buffer) + strlen("string") + 1);
sprintf (Result, "string%s", buffer);
MessageBox(NULL, Result, "", MB_OK | MB_ICONINFORMATION);
delete Result;
- 可以将两个相同类型的连续数组视为一个数组吗?
- [[no_unique_address]] 和两个相同类型的成员值
- C++将两个不同类型的向量的属性连接到新的向量中
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 我想添加两个字符串类型的矩阵.用户将不会输入行数或列的数量.用户将仅输入数组
- 是否可以分配两个不同类型的结构
- C++ 重载运算符 - 减去两个相同类型的对象
- C++:从模板中构造具有两个相同类型名称的海峡
- 比较C 中的两个数据类型
- 在C++中,当两个向量类型不同时,如何将值存储到向量内部的向量中
- 在整数数据类型和连续两个字符类型之后.第 2 个字符的数据类型跳过..为什么
- 确定两个矢量类型或一个矢量类型与标量类型之间的二进制运算结果的正确大小类型
- 在没有公共getter的情况下,比较两个相同类型的对象是否相等
- 在c++中编写两个基本类型之间的重载比较(==)
- 如何在yacc联合中保存出现在同一规则下的两个相同类型的对象
- Bison:$$和$1指向相同的内存位置(两个指针类型的联合YYSTYPE)
- c++中两个float类型变量的精确比较
- 比较两个不同类型的值
- 不能从两个相同类型的源之一创建std::string