Return C-style string from function?

H

howa

#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.
 
P

Papastefanos Serafeim

howa said:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.

When the function finishes the string s goes out of scope,
and, since its in the stack, it becomes garbage.

A quick fix is to change the line
return s.c_str();
to
return strdup(s.c_str() );

Serafeim
 
M

Martin Steen

howa said:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.

const char* test(char *src)
{
return src;
}

OR

const char* test(char *src)
{
static string s(src);
return s.c_str();
}

OR

const char* test(char *src)
{
string* s = new string;
*s = src;
return s->c_str();
}

Best regards,
-Martin
 
M

Martin Steen

const char* test(char *src)
{
string* s = new string;
*s = src;
return s->c_str();
}

I forgot to tell you: that's not good,
because I create a memory leak here.
String s cannot be deleted anywhere.

-Martin
 
D

Daniel T.

"howa said:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.

const char* test( char* src ) {
return src;
}
 
H

howa

Papastefanos Serafeim 寫é“:
howa said:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.

When the function finishes the string s goes out of scope,
and, since its in the stack, it becomes garbage.

A quick fix is to change the line
return s.c_str();
to
return strdup(s.c_str() );

Serafeim

Thanks...

is this a usual/normal way to pass a string out of a function?
 
D

Daniel T.

howa said:
Papastefanos said:
#include <iostream>

using namespace std;

const char* test(char *src) {
string s(src);
return s.c str();
}

int main() {
char src[] = "test123";
cout<<test(src);
return 0;
}

how to get the "test123" from the function?

thanks.

When the function finishes the string s goes out of scope,
and, since its in the stack, it becomes garbage.

A quick fix is to change the line
return s.c str();
to
return strdup(s.c str() );

Serafeim

Thanks...

is this a usual/normal way to pass a string out of a function?

No. strdup isn't even defined in the language. The usual way to do it is
by returning a string that was passed in. See: strcpy for an example.
 
L

loufoque

howa said:
is this a usual/normal way to pass a string out of a function?

No, this is just a way to stop using RAII, hence creating non
exception-safe code and a memory leak in various situations.
This also has many other obvious problems related to pointers.
 
F

Frederick Gotham

howa posted:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?


The memory which the string occupies must still be accessible after the
funciton returns. Therefore, either:

(1) Have the calling function allocate the memory, and pass a pointer so
that the called function will alter the memory.

(2) Have the called function allocate the memory dynamically, and return a
pointer which the calling function shall have to delete.

(3) Use global/static data...
 
J

Jim Langston

howa said:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.

You're going to have problems no matter what method you decide to return a
c-style string. The best solution is to return a std::string. That's why
std::strings were invented, to get rid of this problem. What can returning
a c-style string get you that returning a std::string can't?
 
D

Daniel T.

Martin Steen said:
howa said:
#include <iostream>

using namespace std;

const char* test(char *src) {

string s(src);

return s.c_str();
}

int main() {

char src[] = "test123";

cout<<test(src);

return 0;
};

how to get the "test123" from the function?

thanks.

const char* test(char *src)
{
return src;
}

OR

const char* test(char *src)
{
static string s(src);
return s.c_str();
}

OR

const char* test(char *src)
{
string* s = new string;
*s = src;
return s->c_str();
}

Note, that last one leaks memory every time it is called.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,277
Latest member
VytoKetoReview

Latest Threads

Top