将字符串*类型数组从函数返回到main

时间:2016-03-22 17:33:22

标签: c++ arrays function pointers

我是C ++的新手,我正在研究一个混合字符串的函数

它需要一个字符串数组,将它们混洗,然后将它们返回给主字符串。

我正在返回一个指向名为shuffled的字符串数组的指针。我遇到的问题是,当我尝试将指向数组的新指针保存到main中的另一个指针时,我开始得到奇怪的值,这些值既可以引用计算机中的文件位置,也可以引用一堆数字。

我会在这里发布整个代码,但你真正想要看的是返回类型,我如何返回它以及如何将它保存在main中。请告诉我为什么我的指针没有引用函数中创建的工作数组。这是代码:

#include <cstdio>
#include <string>
#include <ctime>
#include <new>
#include <cstdlib>
using namespace std;

const char * getString(const char * theStrings[], unsigned int stringNum)
{
    return theStrings[stringNum];
}

string * shuffleStrings(string theStrings[])
{
    int sz = 0;
    while(!theStrings[sz].empty())
    {
        sz++;
    }
    sz--;
    int randList[sz];
    for(int p = 0; p < sz; p++)
    {
        randList[p] = sz;
    }

    srand(time(0));//seed randomizer to current time in seconds
    bool ordered = true;
    while(ordered)
    {
        int countNumberInRandList = 0;//avoid having a sz-1 member list length     (weird error I was getting)
        for(int i = 0; i < sz; i++)
        {
            int count = 0;
            int randNum = rand()%(sz+1);//get random mod-based on size
            for(int u = 0; u < sz; u++)
            {
                if(randList[u] != randNum)
                {
                    count++;
                }
            }
            if(count == sz)
            {
                randList[i] = randNum;
                countNumberInRandList++;
            }
            else
                i--;
        }
        //check to see if order is same
        int count2 = 0;
        for(int p = 0; p < sz; p++)
        {
            if(randList[p] == p)
            {
                count2++;
            }
        }
        if(count2 < sz-(sz/2) && countNumberInRandList == sz)
        {
            ordered = false;
        }
    }
    string * shuffled[sz];
    for(int r = 0; r < sz; r++) //getting random num, and str list pointer from passed in stringlist and setting that value at shuffled [ random ].
    {
        int randVal = randList[r];
        string * strListPointer = &theStrings[r];
        shuffled[randVal] = strListPointer;
    }
    for(int i = 0; i < sz; i++)
    {
        printf("element %d is %s\n", i, shuffled[i]->c_str());//correct values in a random order.
    }
    return *shuffled;
}

int main()
{
    string theSt[] = {"a", "b", "pocahontas","cashee","rawr", "okc", "mexican", "alfredo"};
    string * shuff = shuffleStrings(theSt);//if looped, you will get wrong   values
    return 0;
}

3 个答案:

答案 0 :(得分:1)

字符串分配自己的内存,不需要给它们&#34;长度&#34;就像你必须为char数组做的那样。你的代码有几个问题 - 没有详细说明,这里有一些工作/不工作的例子,希望对你有所帮助:

mBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

答案 1 :(得分:0)

这里有一堆错误 - 不要惊慌,这是大多数人在第一次用C和C ++中的指针和数组缠绕脑子时会发生的事情。但这意味着很难指出一个错误,然后说'#34;这就是&#34;。所以我要指出一些事情。

(但是提前警告:你问到指针被返回到main,你的代码确实做错了,我准备说一些关于什么是错的以及如何做得更好。但对你所看到的错误实际上并不负责。)

所以,在shuffleStrings中,您正在制作一个指向字符串(string * shuffled[])的数组。您要求shuffleStrings返回单个指针指向字符串(string *)。你能看到这些不匹配吗?

在C和C ++中,您无法实际传递数组并从函数返回它们。您尝试时获得的行为往往会让新手感到困惑。你需要在某个时候理解它,但是现在我只是说:你实际上不应该让shuffleStrings尝试返回一个数组

有两种更好的方法。第一种是使用不是数组而是使用 vector ,这是一种容器类型,它存在于C ++中但不存在于C中。您可以按值传递数组,并且它们将根据需要进行复制。如果您shuffleStrings返回vector<string*>(并在shuffleStringsmain中进行了其他必要的更改以使用向量而不是数组),那么这可能会有效。

vector<string *> shuffleStrings(...) {
  // ... (set things up) ...
  vector<string *> shuffled(sz);
  // ... (fill shuffled appropriately) ...
  return shuffled;
}

但这可能效率低下,因为你的程序不得不复制大量的东西。 (在这种情况下,它可能不是那么糟糕,因为一小部分指针并不是非常大,因为C ++编译器有时能够弄清楚你在这样的情况下做了什么,并避免复制;现在细节并不重要。)

另一种方法是使数组不在shuffleStrings但在main;传递一个指向该数组的指针(或指向它的第一个元素,事实证明它有点等同)到shuffleStrings;并使shuffleStrings然后修改数组的内容。

void shuffleStrings(string * shuffled[], ...) {
  // ... (set things up) ...
  // ... (fill shuffled appropriately) ...
}

int main(...) {
  // ...
  string * shuffled[sz];
  shuffleStrings(shuffled, theSt);
  // output strings (main is probably a neater place for this
  // than shuffleStrings)
}

说完这一切之后,引起症状的问题出现在shuffleStrings内 - 毕竟,代码中的main实际上从未实际使用从{{1}返回的指针}。

那究竟是什么?我还没弄清楚你的洗牌代码到底要做什么,但这就是我打赌问题所在。你正在创建这个指向字符串的数组,然后你正在填充其元素的一些 - 与shuffleStrings中的数字相对应的元素。但是,如果randList中的数字不涵盖randList中的所有有效索引,那么您将保留其中一些指针未初始化,并且它们可能指向任何位置,然后要求他们shuffled可能会给你各种废话。我希望问题出在哪里。

答案 2 :(得分:0)

您的问题与您说的任何内容无关。由于您是初学者,我建议不要假设您的代码是正确的。相反,我会建议删除那些不被认为有问题的部分,直到你没有任何遗留问题为止。

如果您这样做,您应该很快发现您正在写入无效的内存。

第二部分:你似乎无法确定你要归还的类型。你正在构建一个指向要返回的数组的指针,或者你正在返回一个指针数组....你似乎间歇性地在这些指针之间切换。

第三部分:阅读@ Gareth的回答,他解释了为你的实例很好地传递参数。