c++ - 在 Windows 窗体中将 char 转换为 system.string

标签 c++ winforms textbox c++-cli

我写了一个程序来写不同基数的数字(基数 10,二进制,基数 53,等等...)

我最初在 visual c++ 2010 中将其编写为 win32 控制台应用程序,然后将其转换为 Windows 窗体应用程序(我知道,我知道...)

在原来的形式下,它工作得很好,但在转换之后,它就停止工作了。我将问题缩小为:

该程序使用了一个接收数字并返回字符的函数:

char corresponding_digit(int digit)
{
    char corr_digit[62] = {'0','1','2','3','4','5','6','7','8','9',
                           'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P' ,'Q','R','S' ,'T','U','V','W','X','Y','Z',
                           'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' , 'q','r','s' ,'t','u','v','w','x','y','z'};
    return corr_digit[digit];
}

这个函数取1到61的数字,返回对应的字符:0-9 -> 0-9; 10-35 -> A-Z; 36-61 a->z.

程序使用这样的函数:

//on a button click
//base is an integer got from the user
String^ number_base_n = "";
if(base == 10)
    number_base_n = value.ToString();
else if(base==0)
    number_base_n = "0";
else
{
    int digit, power, copy_value;
    bool number_started = false;
    copy_value = value;
    if(copy_value > (int)pow(float(base), MAX_DIGITS)) //cmath was included
        number_base_n = "Number too big";
    else
    {
        for(int i = MAX_DIGITS; i >= 0; i--)
        {
            power = (int)pow(float(base), i);
            if(copy_value >= power)
            {
                digit = copy_value/power;
                copy_value -= digit*power;
                number_started = true;
                number_base_n += corresponding_digit(digit);
            }
            else if (number_started || i==0)
            {
                number_base_n += "0";
            }
        }
     }
}       
textBox6->Text = number_base_n;

调试了一下后,我意识到问题发生在函数 corresponding_digit 以数字值“1”调用时,在表达式中应返回“1”

//number base_n equals ""
number_base_n += String(corresponding_digit(digit));
//number_base_n equals "49"

number_base_n,从“”开始,以“49”结束,其实就是1的ASCII值。网上查了一下,得到的只是转换结果,用String(value)或者value.ToString(),但显然我做不到

number_base_n += corresponding_digit(digit).ToString();

我尝试使用辅助变量:

aux = corresponding_digit(digit);
number_base_n += aux.ToString();

但我得到了完全相同(错误)的结果...(与 String(value) 相同)

我又摸索了一下,但我相信没有什么值得一提的。 那么...有什么帮助吗?

此外:基数 10 和基数 0 运行良好

编辑:如果投反对票的人愿意发表评论并解释他投反对票的原因......建设性的批评,我相信是这个词。

最佳答案

在 C++/CLI 中,char与 C++ 中的相同:单个字节,代表单个字符。在 C# 中,char (或 System.Char )是一个两字节的 Unicode 代码点。 C++ 和 C++/CLI 相当于 C# 的 charwchar_t . C++ 的 char相当于System::Byte在 C# 中。

如您现在所见,尝试使用托管字符串执行操作会导致托管 API 处理您的 C++ char作为 C# byte , 这是一个数字,而不是一个字符。这就是您获取字符的 ASCII 值的原因,因为它被视为数字,而不是字符。

为了明确说明,我建议您切换 corresponding_digit 的返回类型方法是System::Char .这样,当您使用托管字符串进行操作时,托管 API 将知道相关数据是字符,并且您将获得预期的结果。

System::Char corresponding_digit(int digit)
{
    System::Char corr_digit[62] = {'0','1','2','3','4','5','6','7','8','9',
                           'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                           'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    return corr_digit[digit];
}

您可以进行的其他可能的更改:

  • 使用 StringBuilder 而不是附加字符串。
  • 将 corr_digit 切换为托管数组 ( array<System::Char>^ ),并将其存储在可重复使用的地方。由于现在编写代码,每次调用该方法时,corresponding_digit 方法都必须从头开始重新创建此数组。

关于c++ - 在 Windows 窗体中将 char 转换为 system.string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475889/

相关文章:

c++ - L"下面的:"and "下面的:"有什么区别

c# - 获取图表/表格的下一种颜色?

c# - WPF 如何动态创建文本框并在单击按钮时找到文本框?

c# - 输入字符串的格式不正确,即使我有正确的值

c++ - 在 google-api-cpp-client 中构建专门的服务 API

c++ - Opencv 3.0 features2d.hpp错误: unknown AlgorithmInfo

c++ - 不是root时Semget权限被拒绝,服务器配置问题?

c# - Office 2010/2013 的 Interop.Word 打印预览对话框

c# - 覆盖 WinForms MessageBox 控件

Javascript 事件似乎没有添加到动态生成的文本框中