可有人请我们的阵列我知道为什么人们不能使用输入流如下面的代码需要输入在指针数组为字符串:以输入指针
char *names[5];
for(int i=0; i<5; i++)
{
cout<<"enter name "<<i+1;
cin>>names[i];
}
可有人请我们的阵列我知道为什么人们不能使用输入流如下面的代码需要输入在指针数组为字符串:以输入指针
char *names[5];
for(int i=0; i<5; i++)
{
cout<<"enter name "<<i+1;
cin>>names[i];
}
变量“名”是一个未定义的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";
}
}
感谢您的选择,但这是否意味着我的变体,问题是内存分配,指针数组不能输入到运行时?如果是这样,如果我们动态地将内存分配给数组指针呢? @MrJLP – mwbee
关于第一个选项的警告。 'cin >>名字[i];'。 '''不知道数组的位数,并且如果给出足够的输入,将愉快地写出数组的末尾。 “getline”或“get”可能是更安全的选择,并具有处理“Von Doom”等名称的额外优势。 – user4581301
是的,您可以在迭代中每次动态分配内存。 在第一个C样式示例中,内存分配在堆栈上。 在第二个C++示例中,字符串包含在一个向量中。 vector.resize()是创建5个新字符串的方法。当向量“名称”超出范围时,会自动删除其中的字符串实例。 – MrJLP
免责声明:使用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];
}
}
什么是'ptr'?如果有的话,它与'names'有关吗? –
抱歉@IgorTandetnik我的坏。只是编辑它,如果你现在可以看看就会很棒.. – mwbee
'cin >> names [i]''expect'names [i]'是一个有效的指针,指向一个足够大的字符数组,可以存储。但在你的例子中,'names [i]'是一个包含随机垃圾的未初始化指针。该示例展示未定义的行为,通过访问未初始化的对象。 –