C++ 空字符串,在C+中增加一个大小+;
以下代码段为相同的输入(774)输出不同的结果: A:C++ 空字符串,在C+中增加一个大小+;,c++,C++,以下代码段为相同的输入(774)输出不同的结果: A: #包括 #包括 #包括 使用名称空间std; int main(){ 字符串N; cin>>N; int K=计数(N.begin(),N.end(),'4')+计数(N.begin(),N.end(),'7'); 字符串C=到字符串(K); bool lucky=(K>0)&(count(C.begin(),C.end(),'4')+count(C.begin(),C.end(),'7')==C.size()); cout N; int
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串N;
cin>>N;
int K=计数(N.begin(),N.end(),'4')+计数(N.begin(),N.end(),'7');
字符串C=到字符串(K);
bool lucky=(K>0)&(count(C.begin(),C.end(),'4')+count(C.begin(),C.end(),'7')==C.size());
cout N;
int K=计数(N.begin(),N.end(),'4')+计数(N.begin(),N.end(),'7');
字符串C=”“+K;
bool lucky=(K>0)&(count(C.begin(),C.end(),'4')+count(C.begin(),C.end(),'7')==C.size());
cout“+K
是一个介于常量char*
和int
之间的操作。它在概念上等同于&(“[K])
您从错误获取的指针创建了一个std::string
。它指向一个未指定的位置,使用它来构造std::string
依赖于未定义的行为
有趣的是,如果使用std::string
literal,就会出现编译器错误:
string C = ""s + K;
不做你认为它做的事。你可能认为它等同于std::to_string(K)
,当然不是。它实际做的是将字符串文本的指针“
增加K
这是未定义的行为(因为K
不是0
-这不会改变指针),并且可以得到任何结果。您必须使用std::to_string
或std::atoi
或类似函数。“+K
不正确,这不是问题所在,但您可以通过为宏保留SHOUTCASE名称和通常不使用单字母名称来避免一些压力和额外的工作。两个主要的例外是循环计数器变量,通常是i
,j
和K
,以及模板类型参数,con一般来说,T
。但是,对于后者,我更喜欢打破惯例,编写Type
@yassin:在Java中这也是不好的样式。应该使用String.valueOf(K)
。从技术上讲,如果K
为零或一,那么+K
就是定义的行为。(在后一种情况下,指针指向字符串末尾的空字节之后。)当然,在结束指针之后取消引用以将其转换为字符串是错误的。
#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;
}
string C = ""s + K;
string C = "" + K;