我目前在codeforce上做了一个简单的问题。 基本上,您会得到一个字符串(例如“ 1 + 3 + 2”),并且必须将其排序后返回(例如“ 1 + 2 + 3”)。将仅使用1,2和3。
我从开始:
#include <iostream>
using namespace std;
int main()
{
string str;
int arr[4];
cin >>str;
for(int i = 0; i < str.length();i+=2)
arr[str[i] - '0']++;
}
我的想法是将每次出现的数字存储在数组中。但是我发现如果我要添加一个问题
cout<< arr[2];
并输入“ 1 + 2 + 3”,它输出:
33
但是,它应该为1,因为3只出现一次。
我通过移动“ string str;”解决了它。然后在main上方“ int arr [4]”
#include <iostream>
using namespace std;
string str;
int arr[4];
int main()
{
cin >>str;
for(int i = 0; i < str.length();i+=2)
arr[str[i] - '0']++;
cout<< arr[2];
}
输出:
1
为什么现在可以使用?
答案 0 :(得分:0)
在第一个示例中,您没有初始化int arr[4];
。 因此,您的程序的行为是不确定的。
如果在没有第一个for循环的情况下打印arr
的内容:
for (auto x: arr) {
std::cout << x << "\n";
}
您得到的垃圾数据恰好位于arr
的地址:
121
32584
615125669
22063
但是您不能保证得到任何东西。如果您为编译器提供了无效的程序,则可以随意执行该操作。
您可以通过初始化数组修复:
int arr[4] = {};
这将对数组进行初始化,这对于int
来说是用0
进行初始化。
答案 1 :(得分:0)
在您的第一个示例中,arr
具有自动存储期限,并且由于默认初始化而未初始化:
int main() {
// default initialization
int arr[4];
// reading from arr at this point (remains
// uninitialized) is undefined behaviour.
}
数组类型默认初始化的结果是数组的每个元素都被默认初始化。默认初始化对基本非类类型的影响不大:元素将保持未初始化状态。从此类元素读取(对示例中的元素调用operator++
)是未定义的行为。
您可以例如使用以下语法对arr
进行值初始化:
int main() {
int arr[4]{};
}
具有将数组的每个元素都初始化为值的效果,进而具有将数组的每个元素(基本非类类型)初始化为零的效果。
在第二个示例中,arr
不再具有自动存储持续时间,而是具有静态存储持续时间,并且应用了静态初始化规则,这将导致arr
被初始化为零。
答案 2 :(得分:0)
C ++默认不会将数组初始化为0。您的初始内容是无法预测的,与您的结果相同。
有多种方法可以解决此问题。我建议使用std::vector,将变量声明为:
#include <vector>
std::vector<int> arr(4, 0);
第一个参数是大小,第二个参数是所有元素的初始值(默认为0)。您可以使用[]将其用作数组。它具有其他有用的功能,例如可以根据需要进行扩展。
或者,您也可以使用memset清除数组:
#include <cstring>
memset(arr, 0, sizeof(arr));
此功能较旧,您需要多加注意。