2014-09-29 39 views
-1

您好我想从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; 
} 

谢谢,

+0

代码是否工作?问题是什么? – 2014-09-29 03:51:43

+2

为什么浪费时间将不安全的C代码转换为不安全的C++代码?摆脱指针。 – PaulMcKenzie 2014-09-29 04:03:52

+0

是的,它会以类似的方式工作。但是你的'问题'是什么? – 2014-09-29 04:11:44

回答

3

当你从 'C' 转换为C++,的一个你应该考虑的事情是看看你是否可以做比安全等效的事情更安全的事情。

看看原C代码:

void getPatronName(char *fn, char *ln) { 
    printf("\n  Enter patron name ([first] [last]): "); 
    scanf("%s %s", fn, ln); 
} 

这里的问题是,这个功能不知道如果fnln已拨出适当的空间,或者即使它们是有效的写(指针指向可修改的缓冲区)。所以这个功能很容易崩溃。

A 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。第二件事是fn和ln将允许输入任何大小的字符串数据。所以缓冲区覆盖的机会是0.

+0

谢谢PaulMckenzie – mvitagames 2014-09-29 04:29:26

0

变化

cin<<fn<<ln; 

cin>>*fn>>*ln; 

您需要取消引用指针并更改操作符的方向。

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; 
} 
4

使用>>操作和改变指针引用

void MenUI::getPatronName(string& fn, string& ln) { 
    cout<<endl<<" Enter patron name ([first] [last]: "; 
    cin>>fn>>ln; 
} 
+1

+1,尽管有两个挑剔问题的编码 - 没有理由使用endl而不是使用'\ n'(输出将在读取cin之前刷新,因为它们是“绑定”流,所以额外的'flush'只会减慢速度)。另外,将返回类型为'bool'和'return cin >> fn >> ln;'以便调用者可以测试输入是否可用.... – 2014-09-29 04:14:53

+0

谢谢eno3nt – mvitagames 2014-09-29 04:29:08