我试图找到一种方法用.NET语言在printf样式函数中移植“%c”格式,但是失败了。例如,我该怎么写:
char code = 'a';
sprintf(text,"oops! %c",code);
在C ++ / CLI中我尝试了一些,但他们没有给我'a'!
编辑:
首先,我尝试将某些值格式化为字符'a'或'b'或'c'...环境是VisualStudio 2008,CLI / CPP,.NET 3.5。我写了测试代码来展示我的所作所为。
String^ text;
char charC = 'a';
text = String::Format("(1) Oops! {0}",charC);
OutputDebugString(text);
char charV = 1;
text = String::Format("(2) Oops! {0}",charV + 0x60);
OutputDebugString(text);
text = String::Format("(3) Oops! {0}",(char)(charV + 0x60));
OutputDebugString(text);
int intV = 1;
text = String::Format("(4) Oops! {0}",(char)(intV + 0x60));
OutputDebugString(text);
结果与我的预期不同。
(1) Oops! 97
(2) Oops! 97
(3) Oops! 97
(4) Oops! 97
上面的代码似乎与其他人建议的代码不同。我感到很抱歉,我应该在第一时间详细说明我的所作所为。
如果我们只有{0}来格式化变量,我们就没有选择将它变成像'a'这样的字符或像'97'那样的数字。我没有得到'a',我想问怎么做。
EDIT2:
根据评论的建议,我将'char'改为'Char',就像这样;
String^ text;
Char charC = 'a';
text = String::Format("(1) Oops! {0}",charC);
OutputDebugString(text);
Char charV = 1;
text = String::Format("(2) Oops! {0}",charV + 0x60);
OutputDebugString(text);
text = String::Format("(3) Oops! {0}",(Char)(charV + 0x60));
OutputDebugString(text);
int intV = 1;
text = String::Format("(4) Oops! {0}",(Char)(intV + 0x60));
OutputDebugString(text);
我得到了;
(1) Oops! a
(2) Oops! 97
(3) Oops! a
(4) Oops! a
所以'Char'而不是'char'似乎正在发挥作用。
答案 0 :(得分:0)
char
关键字在C和C ++语言中保留其原始含义,它是MSVC ++中的8位类型,.NET Framework没有等效的字符类型,因此String :: Format()处理它就像System :: SByte的别名。一个整数类型,因此您可以看到整数值而不是字符。
.NET使用utf-16编码的Unicode,System :: Char是16位类型。在与wchar_t
关键字匹配的MSVC ++中。您可以直接使用,也可以使用Char
代替char
。