在c ++中写两个不同类型的变量

时间:2014-04-26 12:18:46

标签: c++ winforms

我知道这个问题可能看起来有点愚蠢,但我尝试了一切,不知道如何制作它,我试图在消息框中写两种不同的类型,一种是如果它们是一个字符串而另一种是像这样的人物:

MessageBox(NULL, buffer, "", MB_OK | MB_ICONINFORMATION);

我试图在缓冲区之前添加一个字符串并尝试

“string”+ buffer

“string”<<缓冲

但都没有奏效。感谢所有回复者都非常感激

修改


我真正的问题是当我尝试将其作为字符串并在消息框中显示时我得到错误无法从字符串转换为LPCSTR

3 个答案:

答案 0 :(得分:4)

使用std::string,你会没事的。我猜buffer 不是类型为char,而是char const *,不是吗?然后您可以使用+运算符:

std::string("string") + buffer;

如果MessageBox采用char const *参数,您可以使用std::string的{​​{1}}成员函数来传递字符串:

c_str()

答案 1 :(得分:0)

在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数组自动构造的。

在相反的情况下,funcgtion需要一个数组,但得到一个std :: string,这会产生一个编译器错误。幸运的是,std :: string有一个函数&#34; c_str()&#34;

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);
}

现在可以将两个std::string添加到sPrefix + sMsg中,结果为std::string。你甚至可以将一个数组附加到std::string sPrefix + szMsg,仍然给出一个std :: string。因此,我们的ShowMessage()功能可能会简化。

void ShowMsg(const char *szMsg)
{
    std::string sPrefix = "Error: ";

    ::MessageBox(NULL, (sPrefix + szMsg).c_str(), "", 
                 MB_OK | MB_ICONINFORMATION);
}

现在我们几乎没有触及字符串复杂性的表面。我建议你近距离接触一个好的C ++文本,并在进一步学习之前先学习字符串。

答案 2 :(得分:-3)

或者作为char字符串(如果缓冲区是char *)

char * Result;
Result = new char (strlen(buffer) + strlen("string") + 1);
sprintf (Result, "string%s", buffer);
MessageBox(NULL, Result, "", MB_OK | MB_ICONINFORMATION);
delete Result;