为什么在使用字符索引数组时会出现这种不同的行为

Why this different behaviour while indexing the array using character?

本文关键字:字符 索引 数组 为什么      更新时间:2023-10-16

我正在尝试编写一个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 个参数是"要填充的字节数",而不是"数组的元素数">