C++ 分配后如何用字符串填充字符?
我有这样的结构:C++ 分配后如何用字符串填充字符?,c++,pointers,memory-management,character,C++,Pointers,Memory Management,Character,我有这样的结构: struct student { int id; string name; string surname; }; 我需要做的是用这个声明来实现功能: char* surname_name (student Student) 这将格式化我输入的每个学生的格式,比如“姓氏,名字”,它将返回指针 到目前为止,我所做的是: char* surname_name (student Student){ char *pointer= (char*) malloc (s
struct student {
int id;
string name;
string surname;
};
我需要做的是用这个声明来实现功能:
char* surname_name (student Student)
这将格式化我输入的每个学生的格式,比如“姓氏,名字”,它将返回指针
到目前为止,我所做的是:
char* surname_name (student Student){
char *pointer= (char*) malloc (sizeof(char)*(Student.name.length + Student.surname.length + 2)); // + 2 because of space and comma
string::iterator it;
int i=0;
for (it= Student.surname.begin(); it != Student.surname.end(); it++){
(*pointer)[i] = it; // here it gives me error
}
... // here still should be added code for comma, space and name
return pointer;
}
我无论如何也做不到,因为在任务中函数需要有这个声明。如何正确制作
(*pointer)[i] = it;
应该是
*(pointer+i) = *it; //assigning the current char to correct position
您还应该适当增加i
您还可以使用
std::string
实现简单的连接。这应该可以实现以下功能:
char * surname_name (student Student){
return strdup((Student.surname + ", " + Student.name).c_str());
}
我更喜欢使用:
如果您确实想返回指针,可以按如下操作:
char *surname_name (const student &Student)
{
string s = Student.name + " " + Student.surname;
char *p = new char [s.length()+1];
strcpy(p, s.c_str());
return p;
}
不要忘记删除返回的指针。您真的需要它作为
字符*
?std::string
不是更好吗?如果您这样需要它,我建议使用char*
作为参数,让用户将自己分配的缓冲区传递给。是的,我肯定会立即使用它,但我不能。需要使用这个函数,因为以后我需要创建其他函数,将此函数作为参数,因此我无法修改声明。您是否可以返回std::string
,然后使用c_str
成员函数将其作为char*
?您可以在字符串中进行串联,然后只需malloc一些内存,memcopy字符串到其中,并返回该字符串。这样会容易得多。我做了这个,并且“I”被下划线为错误,它写着:“错误:表达式必须有指向对象类型的指针”我得到这个错误:错误C4996:“strdup”:此项的POSIX名称不推荐使用。相反,使用ISO C++的一致名称:有关详细信息,请参阅联机帮助。在Windows平台上使用_strdup而不是strdup现在可以工作:)@Joel,当我用return返回指针时,我应该什么时候释放它?如果你在某个时候不释放它,你会有内存泄漏。strdup使用malloc分配指针。为了让代码可读,额外的副本成本是值得的。而且,由于RVO,它没有额外的副本。遗憾的是,它有。您在创建新字符串后复制了它,然后显式地执行strcpy。大多数字符串实现不是写时复制。在创建临时语句时,RVO仅适用于最后一条语句。在本例中,您返回一个指针,因此它不适用。直接复制到字符数组而不是创建字符串是可能的,但这更容易出错,也更难维护。啊哈,你说的是基于指针的解决方案。是的,它有额外的副本。同意。
char *surname_name (const student &Student)
{
string s = Student.name + " " + Student.surname;
char *p = new char [s.length()+1];
strcpy(p, s.c_str());
return p;
}