首页 > 解决方案 > 无法从函数 c++ 返回数组

问题描述

#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>
using namespace std;

void getinput (string &first,string &second);
void lengthcheck (string first, string second);
//int anagramcheck (string word);
int* lettercounter (string input);

int main()
{
    std::string a;
    std::string b;
    getinput(a,b);
    lengthcheck (a,b);
    lettercounter(a);
    lettercounter(b);

    int* one = lettercounter(a);
    int* two = lettercounter(b);

    if (one == two)
        cout << "You Have Entered An Anagram" << endl;
    else
        cout << "You Have Not Entered An Anagram" << endl;
}

void getinput (string &first, string &second) {
    cout << "Enter First Input: ";
    getline(cin, first, '\n');
    cout << "Enter Second Input: ";
    getline(cin, second, '\n');
    cout << "You Entered " << first << " and " << second <<endl;
}

void lengthcheck(string first, string second){
    int lengtha = first.length();
    int lengthb = second.length();
    
    if ((lengthb > 60) || (lengtha > 60)) {
        cout << "Input Is Invalid" << endl;
    } else if (lengtha !=lengthb) {
        cout << "Input is not an anagram" << endl;
    } else {
        cout << "Input is Valid" << endl;
    }
}

int* lettercounter(string input)
{
    static int freq[26] = {0};
    int length = input.length();
    for (int i=0; i<26; i++) {
        freq[i]=0;
    }
    
    for (int i=0; i <length; i++) {
        if(input[i]>='a' && input[i]<='z')
        {
            freq[input[i] - 97]++;
        }
        else if(input[i]>='A' && input[i]<='Z')
        {
            freq[input[i] - 65]++;
        }
    }
    
    for(int i=0; i<26; i++) {
        /* If current character exists in given string */
        if(freq[i] != 0)
        {
           printf("'%c' = %d\n", (i + 97), freq[i]);
        }
        return freq;
    }
}

我无法返回freq从名为 .的用户定义函数命名的数组lettercount。有人可以给我一个提示吗?我需要lettercount返回一个数组。我需要调用函数 lettercount 两次,以便比较每个数组的结果以确定两个输入是否是字谜。我不确定该函数是否将实际值返回给 main。

标签: c++

解决方案


首先,freq不应该是静态的。通过将其设为静态,您将每次都访问同一个数组。对于您想做的事情,您不想总是访问相同的内存。

其次,您不能只返回一个指向尚未动态分配或不是静态的内存的指针。当您超出范围时(即您从函数lettercounter返回到main),数组占用的内存将被释放。因此,您将返回一个指向不再保留的内存的指针,从而导致未定义的行为。

如果您确实需要使用原始指针,那么每次输入lettercounter时,您都需要像这样动态地为数组分配内存int * freq = new int[26];:这将为大小为 26 的数组保留内存。然后,当您返回 freq 时,内存仍将被分配。但是,不要忘记分配的内存new不会自行删除。你必须清理你的烂摊子。在这种情况下,最后main你会调用delete[] one;and delete[] two;

int* lettercounter(string input)
{
  int * freq = new int[26];
    .
    .
    .
  return freq;
}

int main()
{
  .
  .
  int* one = lettercounter(a);
  int* two = lettercounter(b);
  .
  .
  delete[] one;
  delete[] two;
}

无论如何,我建议您学习使用智能指针标准容器(如vector)。这些操作会简单得多。


推荐阅读