#include<bits/stdc++.h>
#include<cstring>
#define arraySize 10
using namespace std;
char returnMaxOccur(char *str);
int main()
{
char str[]="teet";
cout<<"The max occuring character is"<<" "<<returnMaxOccur(str)<<endl;
return 0;
}
char returnMaxOccur(char* str)
{
int high=-1;
char t;
int counter[arraySize]={0};
int len=strlen(str);
for(int i=0;i<len;i++)
{
counter[str[i]]++;
}
for(int i=0;i<len;i++)
{
if(high<counter[str[i]])
{
high=counter[str[i]];
t=str[i];
}
}
return t;
}
#include<bits/stdc++.h>
时的以下问题
包含输入字符串的结果如下,
1)teet: ans is t
2)eett: ans is e
3)ttee: ans is t
4)ette: ans is e
但是当我加入#include<iostream>
时
而不是#include<bits/stdc++.h>
结果是
1)teet: ans is e
2)eett: ans is t
3)ttee: ans is t
4)ette: ans is e
这种行为的原因是什么,或者我做错了什么?
答案 0 :(得分:6)
这是一本关于未定义行为如何在看似奇怪的行为中表现出来的教科书案例。
实际上,包含不同的标头可能会影响内存中某些位置的字节数,当您 使用索引超出数组counter
(大小10)时,您意外观察到的字节数这可能一直到255。
接近此任务的传统方法是使用std::map<char, int>
,它可以有效地充当&#34;稀疏数组&#34;。如果做不到这一点,只要确保你有足够的&#34;插槽&#34;在int[]
中为每个可能的输入。
答案 1 :(得分:1)
第一个重要的是你的代码不正确。请按以下方式更正:
而不是
#define arraySize 10
使用
#define arraySize 128
因为str[i]
可能是任意字符(我假设从0
到127
的ASCII字符)
然后才更改#include
语句重复测试。
第二个 - 通常更重要 - 仅由πάντα ῥεῖ在其链接中表达(Why should I not #include ?)
答案 2 :(得分:0)
当i=0
时,counter[str[i]]++
为counter[116]++
,但计数器数组大小为10.因此代码counter[116]++
会修改任意内存地址。