2014-03-27 34 views
1

指示是“创建一个函数,可以创建一个包含50,000个字符串的数组 - 重复”Hi“,”Hey“,”Hello“,”What's up“12500次,从函数返回字符串数组。函数一个适当的名称和返回类型。“我是否正确创建了这个字符串数组? C++

这是我编写的代码,它编译和所有,但我不知道数字是否正确。

string* greetingArray() 
{ 
    string greetings[50000]; 
    for(int i = 0; i < 50000; i++) 
    { 
     greetings[i++] = "Hi"; 
     greetings[i++] = "Hey"; 
     greetings[i++] = "Hello"; 
     greetings[i++] = "What's up"; 
    } 

    for (int i = 0; i < 50000; i++) 
    { 
     cout << greetings[i] << endl; 
    } 
    return 0; 
} 

int main() 
{ 
    greetingArray(); 
    return 0; 
} 

我把它称为一个简单的主,这是一个好方法来调用该函数? 我在第一个for循环代码为“我< 12500”,即时通讯只是不知道。

+2

要么删除我++的for循环,或删除我++在最后的问候[i ++]中,你实际上每次都通过循环跳过一个字符串。 – dboals

回答

0

在代码中,你说

for(int i = 0; i < 50000; i++) 
{ 
    greetings[i++] = "Hi"; 
    greetings[i++] = "Hey"; 
    greetings[i++] = "Hello"; 
    greetings[i++] = "What's up"; 
} 

当你正在为每一个循环后,错误地递增i,让您的阵列中的每个第五指标是初始化。

这里的一个运行通过:

  • I = 0,问候[0] = “您好”,i ++在计算结果为1
  • I = 1,问候[1] = “嘿”,我+ +求值到2
  • 设为i = 2,问候[2] = “你好”,我++的计算结果为3
  • I = 3,问候[3] = “怎么了”,i ++在计算结果为4
  • i = 4的, for循环结束,i ++评估为5
  • i = 5,问候[5] =“嗨”

此时greetings[4]未初始化,因此访问它是未定义的。

可以改变你的代码:

for(int i = 0; i < 50000; i++) 
{ 
    greetings[i++] = "Hi"; 
    greetings[i++] = "Hey"; 
    greetings[i++] = "Hello"; 
    greetings[i] = "What's up"; 
} 

但是,这并不是一个非常安全的做事方式。我们很幸运,因为50K是由divisble 4

编辑

对于后人,我想我应该指向你对提及你需要真正的从功能而不是0返回数组的答案。所以return greetings;在最后。

一个更好的解决办法是使用std::vector

#define AMOUNT 50000 //change this number for whatever count of strings you need 
std::vector<std::string> greetings; 
while(greetings.size() < AMOUNT){ 
    greetings.push_back("Hi"); 
    greetings.push_back("Hey"); 
    greetings.push_back("Hello"); 
    greetings.push_back("What's up"); 
} 

//print the vector's contents 
for (std::vector<string>::iterator strIter = greetings.begin(); strIter != greetings.end(); ++strIter){ 
    cout << *strIter << endl; 
} 
+1

没关系,我没有看到你的答案的最后一行 – dboals

+0

还有一些写回报值不错 – P0W

+0

是啊,我想你最后一行评论。对我来说看起来不错 – dboals

0

如果你不知道,你为什么不测试你的代码?它没有做它应该做的。让我们先看看分配:

创建一个函数,可以创建一个包含50,000个字符串的数组 - 重复“Hi”,“Hey”,“Hello”,“What's up”12500次。从函数返回字符串数组。给该函数一个适当的名字和返回类型。

让我们从定义函数开始 - 它必须有一个适当的名字和返回类型。它必须返回一个字符串数组。在C++中,它将被声明为:

string* yourFunctionName(); 

这样一部分是正确的。下一页:

创建,创建50000串

数组
{ 
    string myArray[50000]; 

下一个功能:

重复 “嗨”, “嗨”, “你好”,“什么是up“12,500 times

for(unsigned int i=0;i<12500;){ 
     myArray[i*4]="Hi"; 
     myArray[i*4+1]="Hey"; 
     myArray[i*4+2]="Hello"; 
     myArray[i*4+3]=What's up"; 
    } 

你必须做“* 4”,因为你重复东西,通过整个数组(注:12500 * 4 = 50000)。最后一件事,你居然没有做:

返回一个字符串从函数数组

你,在你的代码,返回“0”。 0不是一个字符串数组。这样做:

return myArray; 
1

该功能是错误的。您声明其返回类型为

string* 

但是该函数始终返回零(或空值)指针。这是因为它被定义为一个局部变量的函数不返回数组,它可能不会返回数组

string greetings[50000]; 

将退出功能

这个循环后必须销毁也无效

for(int i = 0; i < 50000; i++) 
{ 
    greetings[i++] = "Hi"; 
    greetings[i++] = "Hey"; 
    greetings[i++] = "Hello"; 
    greetings[i++] = "What's up"; 
} 

例如,索引为4的数组元素不会被设置。

更正确的功能可以被定义下面的方式(未经测试)

#include <iostream> 
#include <string> 

std::string * greetingArray(size_t n) 
{ 
    const size_t N = 4; 
    const char *words[N] = { "Hi", "Hey", "Hello", "What's up" }; 

    std::string *greetings = new std::string[n]; 

    for (size_t i = 0; i < n; i++) 
    { 
     greetings[i] = words[i % N]; 
    } 

    return greetings; 
} 


int main() 
{ 
    size_t N = 50000; 

    std::string *greetings = greetingArray(N); 

    for (size_t i = 0; i < N; i++) 
    { 
     std::cout << greetings[i] << std::endl; 
    } 

    delete [] greetings; 

    return 0; 
} 
+0

为什么在最后删除问候数组? – Christoph

+0

@Christoph释放分配的内存。 –

+0

@Christoph:因为来自莫斯科的Vlad使用了一个动态生成的数组(参见'new'关键字),它在堆上分配内存,而不是堆栈。当你这样做时**你现在负责管理内存,因此需要调用'delete []' – AndyG

0

这工作得很好,我

#include <iostream> 
#include <array> 

const unsigned arraySize = 50000; 

std::array<std::string, arraySize> greetingArray() 
{ 
    std::array<std::string, arraySize> greetings; 
    for(unsigned i = 0; i != greetings.size(); i += 4) 
    { 
     greetings[i] = "Hi"; 
     greetings[i+1] = "Hey"; 
     greetings[i+2] = "Hello"; 
     greetings[i+3] = "What's up"; 
    } 

    return greetings; // return the array, not 0 ! 
} 

int main() 
{ 
    std::array<std::string, arraySize> greetings = greetingArray(); 
    for(unsigned i = 0; i != 20; ++i) std::cout << greetings.at(i) << '\n'; // 20 outputs is plenty to check if it worked 
    return 0; 
} 
相关问题