将C函数代码转换为C ++类方法

时间:2014-09-29 03:50:00

标签: c++ c

您好我正在尝试从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;
 }

感谢,

4 个答案:

答案 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);
}

这里的问题是这个函数不知道fnln是否已经分配了适当的空间,或者即使它们有效写入(指针指向可修改的缓冲区)。所以这个功能很容易崩溃。

缓解这些问题的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;
 }