在c ++中连接两个字符

时间:2018-06-25 07:09:26

标签: c++

我的要求是连接两个字符。例如

 int main()
 {
       char c1 ='0';
       char c2 ='4';
       char c3 = c1+c2;
       cout<< c3;
 }

我期望的值为04。但是我得到的是d。 我知道char是单字节的。我的要求是,可以在C3的单个字节中合并/加入/合并c1,c2并将值存储为04

9 个答案:

答案 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的表示方式,

或在中,您可以使用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::arraystd::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 字符可区分 stringchar 数组。否则,两者都是连续的内存位置。 在计算 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.