【问题标题】:Why this different behaviour while indexing the array using character?为什么在使用字符索引数组时会出现这种不同的行为?
【发布时间】:2017-08-26 17:40:54
【问题描述】:

我正在尝试编写一个 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

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码在问题本身。没有清晰的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • 期望的行为以第二种实现的形式明确给出。我需要的只是一个解释......
  • @PavithranRavichandiran,您不能指望人们点击他们从未听说过的网站的链接,也不能指望该链接无限期保持有效,也不能指望 Google 能够通过当很多问题被隐藏起来时,同样的问题。除此之外,SO 有自己的规则,在使用网站时遵守这些规则是有礼貌的。
  • 好的。现在正确编辑。会有什么怜悯我吗?
  • @PavithranRavichandiran: 是的,仁慈向你展示了 :)

标签: c++ arrays string dictionary


【解决方案1】:

这里的一个重要问题是这一行:

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 的第三个参数是“要填充的字节数”,而不是“数组的元素数”

【讨论】:

  • 第二个例子应该是memset(&amp;map,0,256*sizeof(int));,因为sizeof(int)不保证是4。
  • @user1937198:谢谢你的评论,我更正了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多