为什么在使用字符索引数组时会出现这种不同的行为
Why this different behaviour while indexing the array using character?
我正在尝试编写一个c ++程序来查找第一个非重复字符,如果所有字符都重复,它将返回-1。
我设计了一个解决方案,它使用整数数组跟踪字符计数,我使用必须存储计数的相应字符进行索引。
计划1:给出错误的输出...http://ide.geeksforgeeks.org/wxOYog
#include<iostream>
#include<cstring>
using namespace std;
int map[256];
string returnFirstRepeatingChar(string str,int n)
{
int i=0,flag=1;
string result;
for(i=0;i<n;i++)
map[str[i]]++;
for(i=0;i<n;i++)
{
if(map[str[i]]==1)
{
flag=0;
result = str[i];
break;
}
}
if(flag)
return "-1";
else
return result;
}
int main()
{
//code
int t,N,*arr,i,j;
cin>>t;
string str;
while(t--)
{
cin>>N;
memset(&map,0,256);
cin>>str;
cout<<returnFirstRepeatingChar(str,N)<<endl;
}
return 0;
}
计划2:提供正确的输出...http://ide.geeksforgeeks.org/jJvJPu
#include<iostream>
#include<cstring>
using namespace std;
int map[256];
string returnFirstRepeatingChar(string str,int n)
{
int i=0,flag=1;
string result;
for(i=0;i<n;i++)
map[str[i]-97]++; //changed from above program
for(i=0;i<n;i++)
{
if(map[str[i]-97]==1) //changed from above program
{
flag=0;
result = str[i];
break;
}
}
if(flag)
return "-1";
else
return result;
}
int main()
{
//code
int t,N,*arr,i,j;
cin>>t;
string str;
while(t--)
{
cin>>N;
memset(&map,0,256);
cin>>str;
cout<<returnFirstRepeatingChar(str,N)<<endl;
}
return 0;
}
这两个程序之间的唯一区别是所需计数在数组映射中的位置。在程序 1 中,它从 97 开始(a的 ascii(在程序 2 中,它从 0 开始。
但是程序 2 给出了正确的输出,但程序 1 没有。为什么?
Eg: for input: abcdefghij
program 1 output: f
program 2 output: a
这里的一个重要问题是这一行:
memset(&map,0,256);
在这里,您仅将第一个 256/sizeof(int( 归零。如果 sizeof(int( 是 4,则第一个 64 int。但是,您的程序正在使用索引大于 97 的元素,因此出现了问题。因此应该是
memset(&map,0,256*sizeof(int));
或者也可以简单地写成
memset(map,0,sizeof(map));
记住:memset 的第 3 个参数是"要填充的字节数",而不是"数组的元素数">
相关文章:
- 将转换字符键入 int 以用作向量C++的索引
- 查找字符在两个索引之间出现的次数
- *无符号字符中的索引值
- C++ char 类查找字符索引
- int 数组,但索引是字符?
- 为什么在 c++ 中索引字符串会发出隐式转换警告?
- 根据字符获取数组的索引
- CPP:如何获取字符的最后一个索引
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 将特定索引处的字符数组内容与字符文字 - cpp 进行比较
- 为字符串中的每个字符(不是字符位置!)分配唯一的索引
- 通过字符串的字符对整数数组进行索引
- 从给定索引返回子字符字符串的函数
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 是否可以使用字符串或字符索引数组
- 如何使该程序在数组中打印搜索字符的索引,否则将找不到它
- 如何在 C++ 的字符串中打印从一个索引到另一个索引的字符范围
- 为什么在使用字符索引数组时会出现这种不同的行为
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- 字符串下标超出范围.我不知道如何使用字符索引数组,所以我使用了(无符号整数),但它不起作用