Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配后如何用字符串填充字符?_C++_Pointers_Memory Management_Character - Fatal编程技术网

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