以下代码片段为同一输入输出不同的结果(7747774):
A:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string N;
cin >> N;
int K = count(N.begin(), N.end(), '4') + count(N.begin(), N.end(), '7');
string C = to_string(K);
bool lucky = (K>0) && (count(C.begin(), C.end(), '4') + count(C.begin(), C.end(), '7') == C.size());
cout << (lucky?"YES":"NO") << endl;
return 0;
}
B:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string N;
cin >> N;
int K = count(N.begin(), N.end(), '4') + count(N.begin(), N.end(), '7');
string C = "" + K;
bool lucky = (K>0) && (count(C.begin(), C.end(), '4') + count(C.begin(), C.end(), '7') == C.size());
cout << (lucky?"YES":"NO") << endl;
return 0;
}
A打印YES,而B打印NO,大小为&#39; C&#39;在B中增加了一个。那是为什么?
答案 0 :(得分:2)
string C = "" + K;
不符合您的想法。你可能认为它相当于std::to_string(K)
,没有。 实际所做的是通过""
增加字符串文字K
的指针。
这是未定义的行为(因为K
不是0
- 这不会改变指针),你可以获得任何结果。您必须使用std::to_string
或std::atoi
或类似的功能。
答案 1 :(得分:1)
"" + K
是const char*
和int
之间的操作。它在概念上等同于&(""[K])
您从错误获取的指针创建std::string
。它指向一个未指定的位置,并使用它构建您的std::string
依赖于未定义的行为。
有趣的是,如果您使用std::string
字面值,则会出现编译错误:
string C = ""s + K;