您好我正在尝试从C转换此功能,提示用户输入名字和姓氏,并返回输出参数中的名字和姓氏
//the C codes is this:
void getPatronName(char *fn, char *ln) {
printf("\n Enter patron name ([first] [last]): ");
scanf("%s %s", fn, ln);
}
//will it be equivalent to doing this in C++? :
void MenUI::getPatronName(string *fn, string *ln) {
cout<<endl<<" Enter patron name ([first] [last]): ";
cin>>*fn>>*ln;
}
感谢,
答案 0 :(得分:4)
使用&gt;&gt;运算符并更改指向引用的指针
void MenUI::getPatronName(string& fn, string& ln) {
cout<<endl<<" Enter patron name ([first] [last]: ";
cin>>fn>>ln;
}
答案 1 :(得分:3)
当你从'C'转换为C ++时,你应该考虑的一件事是看你是否可以比C
等价物更安全地做事。
查看原始的C
代码:
void getPatronName(char *fn, char *ln) {
printf("\n Enter patron name ([first] [last]): ");
scanf("%s %s", fn, ln);
}
这里的问题是这个函数不知道fn
或ln
是否已经分配了适当的空间,或者即使它们有效写入(指针指向可修改的缓冲区)。所以这个功能很容易崩溃。
缓解这些问题的C ++翻译将是:
#include <iostream>
#include <string>
using namespace std;
//...
void getPatronName(string& fn, string& ln) {
cout << "\n Enter patron name ([first] [last]: ";
cin >> fn >> ln;
}
为什么这样更安全?首先,您必须将有效的std::string
传递给该函数。传递无效std::string
是没有机会(除非你做某种真正的hackery)。第二件事是fn和ln将允许输入任何大小的字符串数据。因此缓冲区覆盖的可能性为0。
答案 2 :(得分:0)
更改
cin<<fn<<ln;
到
cin>>*fn>>*ln;
您需要取消引用指针并更改运算符的方向。
答案 3 :(得分:0)
// C代码是这样的:
void getPatronName(char *fn, char *ln) {
printf("\n Enter patron name ([first] [last]): ");
scanf("%s %s", fn, ln);
}
//will it be equivalent to doing this in C++? :
void MenUI::getPatronName(string* fn, string* ln) {
cout<<endl<<" Enter patron name ([first] [last]: ";
cin>>*fn;
cin>>*ln;
}