468,491 Members | 1,952 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,491 developers. It's quick & easy.

Return C-style string from function?

#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.

Oct 23 '06 #1
10 6212

"howa" <ho******@gmail.comwrote in message
news:11*********************@b28g2000cwb.googlegro ups.com...
#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
Oct 23 '06 #2
In article <11*********************@b28g2000cwb.googlegroups. com>,
"howa" <ho******@gmail.comwrote:
#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;
}

--
To send me email, put "sheltie" in the subject.
Oct 23 '06 #3

Papastefanos Serafeim 寫道:
"howa" <ho******@gmail.comwrote in message
news:11*********************@b28g2000cwb.googlegro ups.com...
#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?

Oct 23 '06 #4
"howa" <ho******@gmail.comwrote:
Papastefanos Serafeim wrote:
>"howa" <ho******@gmail.comwrote:
>>#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.

--
To send me email, put "sheltie" in the subject.
Oct 23 '06 #5
howa wrote:
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.
Oct 23 '06 #6
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...

--

Frederick Gotham
Oct 23 '06 #7
howa wrote:
#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

Oct 23 '06 #8
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

Oct 23 '06 #9
"howa" <ho******@gmail.comwrote in message
news:11*********************@b28g2000cwb.googlegro ups.com...
#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?
Oct 23 '06 #10
In article <45**********@news.arcor-ip.de>,
Martin Steen <a0******************@spamgourmet.comwrote:
howa wrote:
#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.

--
To send me email, put "sheltie" in the subject.
Oct 23 '06 #11

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Rhino | last post: by
1 post views Thread by Jack Addington | last post: by
2 posts views Thread by 6kjfsyg02 | last post: by
6 posts views Thread by miked | last post: by
14 posts views Thread by tshad | last post: by
9 posts views Thread by Alexander Widera | last post: by
reply views Thread by terminator(jam) | last post: by
4 posts views Thread by fabian.lim | last post: by
reply views Thread by NPC403 | last post: by
reply views Thread by theflame83 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.