Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 空字符串,在C+中增加一个大小+;_C++ - Fatal编程技术网

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

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

以下代码段为相同的输入(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 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;