【问题标题】:can anyone please tell me what's wrong with my c++ code?谁能告诉我我的 C++ 代码有什么问题?
【发布时间】:2020-04-29 10:22:26
【问题描述】:

问题:给定一个文本 txt[0..n-1] 和一个模式 pat[0..m-1],编写一个函数 search(char pat[], char txt[]) 打印所有出现的pat[] 及其在 txt[] 中的排列(或字谜)。你可以假设 n > m。

#include<iostream>
#include<cstring> 
#define MAX 256 
using namespace std; 

void search(char *pat, char *txt) 
{ 
    int M = strlen(pat), N = strlen(txt); 
    int i,count=0,start=0 ; 
    int hashpat[26]={0},hashtxt[26]={0}; 
    for(i=0;i<M;i++)
    {
        hashpat[pat[i]]++;
    }
    for(i=0;i<N;i++)
    {
        hashtxt[txt[i]]++; 
        if(hashtxt[txt[i]]<=hashpat[txt[i]])
        count++;
        if(count==M)
        {   cout<<"Found at index"<<i-M<<"\n"; 
            hashtxt[txt[start]]--; 

            if(hashpat[txt[start]]!=0) count--;
            start++;
        }
    }
} 

/* Driver program to test above function */
int main() 
{ 
    char txt[] = "BACDGABCDA"; 
    char pat[] = "ABCD"; 
    search(pat, txt); 
    return 0; 
}

【问题讨论】:

  • 为什么您认为您的代码有问题?为什么在 C++ 中使用 C 字符串?
  • 嘿兔子,请查看how to ask a good question 并尝试相应地改进您的问题。特别是,“谁能告诉我出了什么问题” 非常不具体,而且您的问题至少缺少对您遇到的问题的清晰描述。此外,您当前的输出加上您期望的输出和所有错误消息(如果有)会有所帮助。
  • 代码中的第一个问题是访问hashpathashtxt 数组的方式。您直接使用 char 值来索引 26 大小的整数数组。使用hashpat[pat[i]-'A'] 而不是hashpat[pat[i]] 来进行正确的索引。另外,在其他地方也解决这个问题。您的代码中可能存在其他逻辑错误。

标签: c++ string anagram


【解决方案1】:

你没有描述你遇到的实际问题,我不会去检查你的代码是否满足问题。但是,至少有一个明显的缺陷。

char 是一个单字节,可以容纳 0-255 之间的数字。大写字母占据 65-90 (*) 的范围,例如 this page。所以pat 实际上看起来像这样:{65, 66, 67, 68}

您正在尝试使用这些数字输入hashpat,这些数字远大于数组的长度。您需要将它们分配为 256 的大小,这很方便您已经定义了。

int hashpat[MAX]={0};
int hashtxt[MAX]={0};

其他一些随机建议:

  • 鉴于您正在传递 char*,您可能应该创建这些 char 数组。
  • search 的参数和main 中的变量都应该是const char*,因为这是字符串文字的类型
  • 鉴于您使用的是 C++,您应该考虑使用 vectorstring 而不是数组和字符,这通常会使事情变得更容易一些。

(*) 假设我们使用的是 ASCII/UTF-8,但这完全是另一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2011-09-03
    • 2019-07-27
    • 2021-08-15
    相关资源
    最近更新 更多