我的要求是连接两个字符。例如
int main()
{
char c1 ='0';
char c2 ='4';
char c3 = c1+c2;
cout<< c3;
}
我期望的值为04。但是我得到的是d
。
我知道char是单字节的。我的要求是,可以在C3的单个字节中合并/加入/合并c1,c2并将值存储为04
答案 0 :(得分:4)
char
不是string
。因此,您可以先将第一个char转换为字符串,然后添加以下类似的字符:
int main()
{
char c1 ='0';
char c2 ='4';
auto c3 = std::string(1,c1)+c2;
std::cout<< c3;
}
什么是“魔术” std::string(1,c1)
:
它使用形式为std::string::string (size_t n, char c);
的std :: string构造函数。因此,它将用给定c1的一个字符“ 0
”填充字符串。
如果添加字符,则会得到将其数字值相加的结果:
int main() {
std::cout << (int)c1 << std::endl;
std::cout << (int)c2 << std::endl;
std::cout << (int)c1+c2 << std::endl;
std::cout << char(c1+c2) << std::endl;
}
来自0
的int值为48,来自4
的int为52。将两者相加得到100。而100是ascii编码中的d
。
答案 1 :(得分:3)
您想要的被称为字符串。有多种方法可以在C++
中进行创建。一种方法是使用标准库中的std::string
类:
char c1 = '0';
char c2 = '4';
std::string s; // an empty string
s += c1; // append the first character
s += c2; // append the second character
cout << s; // print all the characters out
答案 2 :(得分:0)
C(和C ++)中的每个char具有一个字节的长度。您正在做的是添加实际的字节值:
'0' = 0x30
'4' = 0x34
-> '0' + '4' = 0x30 + 0x34 = 0x64 = 'd'
如果要连接这两个,则需要一个数组:
int main()
{
char c1 ='0';
char c2 ='4';
char c3[3] = {c1,c2,0}; // 0 at the end to terminate the string
cout<< c3;
return 0;
}
请注意,使用char进行这些操作是C而不是C ++。在C ++中,您将使用字符串,就像Klaus在他的回答中所做的那样。
答案 3 :(得分:0)
您所说的“联接”实际上是对char
类型的算术,它隐式地将它们提升为int
。字符的等效整数值由ASCII表定义(“ 0”为48,“ 4”为52,因此48 + 52 = 100,最终为“ d”)。通过std::string
运算符连接文本变量时,您想使用+
。
答案 4 :(得分:0)
由于基本的char
没有operator+
才能与另一个char
连接,
您需要的是使用string literal来表示std::string
的表示方式,
或在c++17中,您可以使用string_view
,
char array[2] = {'0', '4'};
std::string_view array_v(array, std::size(array));
std::cout << array_v; // prints 04
答案 5 :(得分:0)
您可以这样做:
<xsl:template match="table">
<xsl:for-each-group select="table-band" group-by="row/cell[position()=
count(ancestor::table/table-band[1]/row/cell[label='PERSONNAME']/preceding-sibling::*)+1]/data">
<xsl:variable name="op_type" select="row/cell[position()=1]/data"/>
<xsl:variable name="id_type" select="row/cell[position()=10]/data" />
<xsl:choose>
...
答案 6 :(得分:0)
char
只不过是C ++运行时用于显示人类可读内容的整数类型。
因此c1 + c2
是两个数字相加的指令,由于类型转换的规则,它是int
类型。如果太大而无法容纳char
,则对c3
的赋值将具有实现定义的结果。
如果要串联,则
std::cout << ""s + c1 + c2;
从C ++ 11的用户定义文字开始,成为惯用的方式。请注意后缀s
。
答案 7 :(得分:0)
简单加法不适用于“组合”两个字符,您永远无法从22中确定它是否由10和12、11和11、7和15或任何其他组合组成;此外,如果订单相关,您将永远不会知道订单是10和12还是12和10 ...
现在,您可以将值组合到数组或std::string
中(如果表示任意8位数据,您甚至可能更喜欢std::array
或std::vector
)。另一个变种是做一些很好的数学运算:
combined = x * SomeFactorLargerThanAnyPossibleChar + y;
现在您可以通过除法和模运算来取回两个值。
假设您只想编码ASCII,128就足够了;考虑最大值,您将得到:127*128+127 == 127*129 == 2^14 - 1
。不过,您可能会自己遇到问题:结果可能需要多达14位,因此您的结果将不再适合简单的char(至少在典型的现代硬件中,char通常只有8位-某些系统不过,周围只有16位char ...)。
因此,您需要更大的数据类型:
uint16_t combined = x * 128U + y;
//^^
侧面说明:如果改用256,则x和y的每个将放置在uint16_t的两个字节的单独字节中。另一方面,如果使用uint64_t和127作为因子,则在一个数据类型中最多可以组合9个ASCII字符。无论如何,您都应该始终使用2的幂,以便您的乘法和除法可以实现为移位,模运算可以实现为简单的AND运算并带有适当的掩码。
如果您也使用非ASCII字符,则必须格外小心:char可能是带符号的,因此为了防止在将值提升为int时因符号扩展而导致的不良影响,您还需要应用强制转换:
uint16_t combined = static_cast<uint8_t>(x) * 128U + static_cast<uint8_t>(y);
答案 8 :(得分:0)
基础第一
在 C++ 和 C 中,字符串以 '\0'
结尾,称为 null
字符。
末尾是否存在此 null
字符可区分 string
和 char
数组。否则,两者都是连续的内存位置。
在计算 string.length()
时不计算末尾的 null
字符是很小心的。
连接/连接两个字符
如果您使用 +
运算符连接两个字符,则将小心处理两个字符串 end 中的 null
字符。
但是,如果您将两个 char
与 +
运算符连接起来并希望将其视为 string
,则不会发生,因为它的末尾没有 null
字符。
请参见下面的示例:
char c1 = 'a';
char c2 = 'b';
string str1 = c1 + c2;
cout << str1; // print some garbled character, as it's not valid string.
string str2; // null initialization
str2 = str2 + c1 + c2;
cout << str2; // prints ab correctly.
string s1 = "Hello";
string s2 = "World";
string str3 = s1 + s2;
cout << str3; //prints Hello World correctly.
string str4 = s1 + c1;
cout << str4; //prints Hello a correctly.