2017-04-01 88 views
0

可有人请我们的阵列我知道为什么人们不能使用输入流如下面的代码需要输入在指针数组为字符串:以输入指针

char *names[5]; 

for(int i=0; i<5; i++) 
{ 
cout<<"enter name "<<i+1; 
cin>>names[i]; 
} 
+0

什么是'ptr'?如果有的话,它与'names'有关吗? –

+0

抱歉@IgorTandetnik我的坏。只是编辑它,如果你现在可以看看就会很棒.. – mwbee

+0

'cin >> names [i]''expect'names [i]'是一个有效的指针,指向一个足够大的字符数组,可以存储。但在你的例子中,'names [i]'是一个包含随机垃圾的未初始化指针。该示例展示未定义的行为,通过访问未初始化的对象。 –

回答

1

变量“名”是一个未定义的char指针数组。这是你的第一个问题。这些指针是未定义的,没有为它们分配内存。 在您的原始代码示例中,有五个带有未定义值的char指针。这就是程序崩溃的原因,因为它试图访问指针中无效地址的内存。 另一个问题是没有分配内存来存放从stdin进入的字符数组。

你可以做这样的事情,让您的原来的例子,而不崩溃工作:

#include <iostream> 
#include <string.h> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    char names[5][128]; 
    memset(names, 0, sizeof(names)); 

    for (int i = 0 ; i < 5 ; i++) 
    { 
     cout << "enter name " << i+1 << ": "; 
     cin >> names[i]; 
    } 

    for (int i = 0 ; i < 5 ; i++) 
    { 
     cout << names[i] << "\n"; 
    } 
} 

这种分配5个128个字符的字符串数组。它也使用memset()清除数组。

因为这是C++,它似乎更有意义,做它的C++风格。

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

const int NUM_NAMES = 5; 

int main(int argc, char** argv) 
{ 
    vector<string> names; 
    names.resize(NUM_NAMES); 

    for (int i = 0 ; i < NUM_NAMES ; i++) 
    { 
     cout << "enter name " << i+1 << ": "; 
     cin >> names[i]; 
    } 

    for (int i = 0 ; i < NUM_NAMES ; i++) 
    { 
     cout << names[i] << "\n"; 
    } 
} 
+0

感谢您的选择,但这是否意味着我的变体,问题是内存分配,指针数组不能输入到运行时?如果是这样,如果我们动态地将内存分配给数组指针呢? @MrJLP – mwbee

+1

关于第一个选项的警告。 'cin >>名字[i];'。 '''不知道数组的位数,并且如果给出足够的输入,将愉快地写出数组的末尾。 “getline”或“get”可能是更安全的选择,并具有处理“Von Doom”等名称的额外优势。 – user4581301

+0

是的,您可以在迭代中每次动态分配内存。 在第一个C样式示例中,内存分配在堆栈上。 在第二个C++示例中,字符串包含在一个向量中。 vector.resize()是创建5个新字符串的方法。当向量“名称”超出范围时,会自动删除其中的字符串实例。 – MrJLP

0

免责声明:使用char*std::cin阅读 通常是一个坏主意,我建议你学习如何在未来使用std::string

此外这个问题本来会更适合codereview.SE,但现在我会忽略它。

下面是做你想做的事情的一个例子,但我强烈坚持你避免在任何真正的代码中做这件事。

char * names[5]; 

// Allocate names 
for (int i = 0; i < 5; i++) 
{ 
    // Use 256 characters as a buffer 
    // any names longer than that might cause errors 
    names[i] = new char[256]; 
} 

// Do IO 
for (int i = 0; i<5; i++) 
{ 
    // Append std::endl 
    std::cout << "enter name " << i + 1 << std::endl; 
    // This isn't very robust since the user can give anything as a name, 
    // and they can't use spaces because of how cin works in this example. 
    std::cin >> names[i]; 
} 

// Use names 
for (int i = 0; i < 5; i++) 
{ 
    // Printing names is just an example 
    // you could write the names to somewhere more important 
    // you could copy them to a smaller location to use less memory 
    std::cout << names[i] << std::endl; 
} 

// Dispose of names when done 
for (int i = 0; i < 5; i++) 
{ 
    // Check pointer isn't null 
    if (names[i] != nullptr) 
    { 
     // Never forget to delete 
     delete names[i]; 
    } 
} 
+0

如果我们对数组的长度进行硬编码,那么使用指针就没有意义了。所以我可以得出这样的结论:我们无法'准备'在数组指针中输入数据b/c没有为它分配内存,因为这些指针只是将地址存储在内存中的某处,然后指向数据输入。 P.S我正在处理一些与指针工作有关的问题,因此无法使用字符串或多维数组。 TIA – mwbee

+0

@mwbee你给的例子有一个硬编码的数组长度,我只是调整你提供的代码。我不确定你的评论的其余部分应该怎么说。指针不会被重定向到指向输入,数据输入被复制到指针所指向的内存块中。 – Pharap