我决定学习以前编程知识非常有限的C ++。我目前正在关注 Alex Allain 这本书 Jumping into C ++ 。我已经点击了关于指针的章节,作为练习问题的一部分,我遇到了以下问题:
- 编写一个功能,提示用户输入他或她的名字和姓氏,作为两个单独的值。此函数应通过传递给函数的其他指针(或引用)参数将两个值都返回给调用者。首先尝试使用指针,然后使用引用。
醇>
这是我写的代码:
#include <iostream>
void getDetails(char * n, char * s)
{
std::cout << "Input name: ";
std::cin >> *n;
std::cout << "\n";
std::cout << "Input surname: ";
std::cin >> *s;
}
int main()
{
char *name = NULL;
char *surname = NULL;
getDetails(name, surname);
std::cout << "Name: " << *name << "\n";
std::cout << "Surname: " << *surname << "\n";
return 0;
}
我一直遇到访问冲突错误,我完全不知道为什么。
答案 0 :(得分:8)
实际上你有两个问题:
name
和surname
保留内存(这就是您遇到访问冲突错误的原因)cin
中的一个字符(因为您要取消引用char*
,这会产生一个字母字符)您只需使用std::string
代替char*
答案 1 :(得分:2)
除了MrMarley Thomas Sparber的答案*之外,您可能会发现std::getline
函数对std::istream::operator>>
函数感兴趣,因为Generics在空格上打破并且用户优先名称可能包含一个。
(*)暂不予评论。
答案 2 :(得分:0)
您没有在存储名称和姓氏的位置分配内存。 你的指针是空指针。
char *name = NULL;
char *surname = NULL;
因此该程序具有未定义的行为。
另外我认为作者意味着使用std::string
在这种情况下,程序看起来像
#include <iostream>
#include <string>
void getDetails( std::string *n, std::string *s )
{
std::cout << "Input name: ";
std::cin >> *n;
std::cout << "\n";
std::cout << "Input surname: ";
std::cin >> *s;
}
void getDetails( std::string &n, std::string &s )
{
std::cout << "Input name: ";
std::cin >> n;
std::cout << "\n";
std::cout << "Input surname: ";
std::cin >> s;
}
int main()
{
std::string name;
std::string surname;
getDetails( &name, &surname);
std::cout << "Name: " << name << "\n";
std::cout << "Surname: " << surname << "\n";
std::cout << "\nAnd one more" << "\n";
getDetails( name, surname);
std::cout << "Name: " << name << "\n";
std::cout << "Surname: " << surname << "\n";
return 0;
}