在C ++中,空字符串将大小增加一

时间:2016-11-13 08:56:06

标签: c++

以下代码片段为同一输入输出不同的结果(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中增加了一个。那是为什么?

2 个答案:

答案 0 :(得分:2)

string C = "" + K;

不符合您的想法。你可能认为它相当于std::to_string(K),没有。 实际所做的是通过""增加字符串文字K的指针。

这是未定义的行为(因为K不是0 - 这不会改变指针),你可以获得任何结果。您必须使用std::to_stringstd::atoi或类似的功能。

答案 1 :(得分:1)

"" + Kconst char*int之间的操作。它在概念上等同于&(""[K])

您从错误获取的指针创建std::string。它指向一个未指定的位置,并使用它构建您的std::string依赖于未定义的行为。

有趣的是,如果您使用std::string字面值,则会出现编译错误:

string C = ""s + K;