我写了一个程序,用不同的基础编写数字(基数为10,二进制,基数为53,无论如何......)
我在visual c ++ 2010中将其作为win32控制台应用程序非常简单地编写,然后将其转换为Windows窗体应用程序(我知道,我知道......)
在原始形式中,它工作得很好,但转换后,它停止工作。我把问题缩小到了这个范围:
程序使用一个接收数字的函数并返回一个char:
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;
调试了一下之后,我意识到当函数related_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正常运作
编辑:如果downvoter会关心评论并解释他为什么贬低...建设性批评,我相信是这个词。
答案 0 :(得分:1)
在C ++ / CLI中,char
与C ++中的相同:单个字节,表示单个字符。在C#中,char
(或System.Char
)是一个双字节Unicode代码点。与C#的char
等效的C ++和C ++ / CLI是wchar_t
。 C ++的char
相当于C#中的System::Byte
。
正如您现在所做的那样,尝试使用托管字符串执行操作会导致托管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];
}
您可以做出的其他可能的更改:
array<System::Char>^
),并将其存储在可重用的位置。在编写代码时,每次调用方法时,related_digit方法都必须从头开始重新创建此数组。