0%

【C++】每日 Bug - int 转 string

今天在刷题时遇到这个错,题目如下:

1
2
3
4
5
6
7
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

输入:"aabcccccaaa"
输出:"a2b1c5a3"

输入:"abbccd"
输出:"abbccd"

题目不难,遍历一遍就完事了,每次把不同的字符和次数加载新字符串后面,问题就出现在次数上:

1
2
ans.push_back(s[i]);
ans.push_back('0'+i-cur);

0-9 这样是没问题的,但是超过 9 就有问题了,提交代码就错了:

1
2
3
输入:"rrrrrLLLLLPPPPPPRRRRRgggNNNNNVVVVVVVVVVDDDDDDDDDDIIIIIIIIIIlllllllAAAAqqqqqqqbbbNNNNffffff"
输出:"r5L5P6R5g3N5V:D:I:l7A4q7b3N4f6"
预期:"r5L5P6R5g3N5V10D10I10l7A4q7b3N4f6"

查 ASCII 表就可以发现问题,9 后面是 :,正如错误答案一样 :p

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
二进制      十  八  图形
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?

后面查了一下,C++ 11 有个新函数用来将 int 转 string:

1
2
3
4
5
6
7
8
9
std::string to_string(int value); (1) (C++11起)
std::string to_string(long value); (2) (C++11起)
std::string to_string(long long value); (3) (C++11起)
std::string to_string(unsigned value); (4) (C++11起)
std::string to_string(unsigned long value); (5) (C++11起)
std::string to_string(unsigned long long value); (6) (C++11起)
std::string to_string(float value); (7) (C++11起)
std::string to_string(double value); (8) (C++11起)
std::string to_string(long double value); (9) (C++11起)

替换掉之后就 OK 了!

Welcome to my other publishing channels