2013-01-13 92 views
-7

OMG IM时如此混乱,现在字符指针数组

这里有什么问题,我可以做些什么来解决它

编辑什么: OMG我很抱歉......我只是这样忽高忽低现在,我甚至不能问一个问题

我想分配10个输入字符串到一个指针数组。

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    char *mess[10]; 
    int i = 0; 

for (; i < 10; i++) 
{     
    cout << "Enter a string: "; 
    cin.getline(mess[i], 80); 
} 

for (i = 0; i < 10; i++) 
    cout << mess[i]; 

system("PAUSE"); 
return EXIT_SUCCESS; 
} 
+0

你为'system'包含''吗? – 0x499602D2

+1

你能描述你遇到的问题吗? – 0x499602D2

+0

你在问这个SO问题有什么问题?从哪里开始... –

回答

3

你想大概是宣布你的阵列这样什么:

char mess[10][80]; 

正如你从函数getline读取多达80个字符。

您当前的实现构建了一个10 char*的数组,它们从未初始化为指向已分配的缓冲区。

更安全的方法是使用std::string作为缓冲区大小将为您处理。一个简单的改变:

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

int main(int argc, char *argv[]) 
{ 
    std::string mess[10]; 
    int i = 0; 

    for (; i < 10; i++) 
    {     
     cout << "Enter a string: "; 
     cin >> mess[i]; 
    } 

    for (i = 0; i < 10; i++) 
     cout << mess[i] << endl; // you probably want to add endl here 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

应该给你你想要的。

编辑

如果你绝对需要char *(这是不是一个好主意),这里就是你要找的内容:

#include <iostream> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    char* mess[10]; 
    int i = 0; 

    for (; i < 10; i++) 
    {     
     cout << "Enter a string: "; 
     mess[i] = new char[80]; // allocate the memory 
     cin.getline(mess[i], 80); 
    } 

    for (i = 0; i < 10; i++) 
    { 
     cout << mess[i] << endl; 
     delete[] mess[i]; // deallocate the memory 
    } 

    // After deleting the memory, you should NOT access the element as they won't be pointing to valid memory 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+0

是啊我知道我可以做到这一点,但我需要使用一个字符指针数组 –

+0

你没有很好的理由混合C和C++然后.. 。你将需要'新'和'删除'缓冲区,以适应你的字符串 – emartel

+0

我刚刚更新使用你想要的数据 – emartel

2

您正在分配10个指针,但从未初始化它们以指向getline可以读取输入的空间。

+0

正确。对于一个奖励积分,建议'std :: string'并显示它是如何完成的 –

2

必须先初始化您声明这里的指针char *mess[10];为他们分配内存。您可以通过使用new()表达式来分配请求的内存。

char *mess[10]; 
for (int k=0; k<10; k++) 
{ 
    mess[k]=new char[80]; 
} 

请记住,使用new()功能,你必须始终取消分配你的数据做后用的存储器分配内存后。你可以 - ,你总是应该 - 使用delete()表达式释放内存。

for (int j=0; j<10; j++) 
{ 
    delete[] mess[j]; 
} 

有关动态分配/释放内存的更多信息,请参阅here

+1

您的解决方案泄漏内存 – emartel

+0

@emartel在哪里? –

+0

你的new'd数组需要在使用后删除[] – emartel