reset char array

R

Rick

Hi,

This is probably piece of cake for you C gurus but it is giving me a
headache. I'm still not really used with pointers and chars so many things
are going wrong. Practicing makes wonders but the problem is that I don't
have much time to practice. Ok, here's the question, how to reset a char
array?
I got this code :

char test[8] = "";

printf( subStr( "result = %s \n" , "blablabla" , 3,5, test ) );
printf( subStr( "result = %s \n" , "another string" , 3,5, test ) );

subStr is a selfmade function which get's a few chars out of the input
parameter and puts it in the output parameter (test in this case). The first
time I use it it works ok, but of course, the second time the test char
array will grow further instead of being replaces. So while the result
should be :
"bla"
"the"
I get
"bla"
"thebla"
It's because of subStr uses strcat and the second time I use it the test
array is still filled with some old stuff. How to get rid of that? I tried
free( test );
between those 2 but that didn't work.

Greetings,
Rick
 
R

Rick

Ok, this is one way of doing it
test[2] = 0;
test[3] = 0;
// or do it in a loop

But I got the feeling I'm doing it on a stupid way...

Greetings,
Rick
 
A

Andreas Kahari

Rick wrote: said:
subStr is a selfmade function which get's a few chars out of the input
parameter and puts it in the output parameter (test in this case). The first
time I use it it works ok, but of course, the second time the test char
array will grow further instead of being replaces. So while the result
should be :
"bla"
"the"
I get
"bla"
"thebla"
It's because of subStr uses strcat and the second time I use it the test

Why not strcpy()? That feels more sensible.
array is still filled with some old stuff. How to get rid of that? I tried
free( test );

You may only free() stuff that you have malloc()'ed.


You could also try test[0]='\0' inbetween the two invocations,
but that wouldn't really solve the problem of a faulty subStr()
implementation, just work around it.
 
R

Rick

You're right, I'm better of with a good function. I fixed it and now it
works like the strncpy function, much better. But the string drame ain't
over, I got another questions. First of all, I noticed that all the string
functions I saw (I looked at string.h) need a pointer parameter so they can
write directly to it. I tried to make functions without that but then they
won't work anymore, an example :

char *test(){
char *s = "blabla";
return s;
} // result is, well, not readable

But if I do
char *test( char *s ){
return s;
} // result is ok

It probably has to do with all the allocate stuff doesn't it? Or can't
string functions work without this parameter?
Another question, it's about strcmp. Now that subStr function is finally
working I want the result to be compared like this
char s[8];
subStr( "abcdef", 1,2,8 ); // result is "BC"
if ( strcmp( s, "BC" ) == 1) printf( "How amazing." );

I worked before with strcmp and it worked but now suddenly I can't get the
right result. Even if I do this
if ( strcmp( "A", "A" ) == 1) printf( "That just has to be right." );
It won't work. What's wrong with my input?

Greetings,
Rick
 
A

Andreas Kahari

Rick wrote: said:
write directly to it. I tried to make functions without that but then they
won't work anymore, an example :

char *test(){
char *s = "blabla";
return s;
} // result is, well, not readable


See the FAQ here:

http://www.eskimo.com/~scs/C-faq/q7.5.html


[cut]
It probably has to do with all the allocate stuff doesn't it? Or can't
string functions work without this parameter?


I'm not quite sure what you mean with "work"...

Another question, it's about strcmp. Now that subStr function is finally
working I want the result to be compared like this
char s[8];
subStr( "abcdef", 1,2,8 ); // result is "BC"
if ( strcmp( s, "BC" ) == 1) printf( "How amazing." ); [cut]
if ( strcmp( "A", "A" ) == 1) printf( "That just has to be right." );


The strcmp() library function returns the difference between two
strings. A return value of zero means that the strings were
equal.
 
E

Ed Morton

You're right, I'm better of with a good function. I fixed it and now it
works like the strncpy function, much better. But the string drame ain't
over, I got another questions. First of all, I noticed that all the string
functions I saw (I looked at string.h) need a pointer parameter so they can
write directly to it. I tried to make functions without that but then they
won't work anymore, an example :

char *test(){
char *s = "blabla";
return s;
} // result is, well, not readable

The above should be fine. Are you sure you didn't instead do:

char s[7] = "blabla";

as that would be wrong.

if ( strcmp( "A", "A" ) == 1) printf( "That just has to be right." );

Make that "== 0". See
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.14.html#strcmp

Ed.
 
B

bd

Rick said:
Ok, this is one way of doing it
test[2] = 0;
test[3] = 0;
// or do it in a loop

But I got the feeling I'm doing it on a stupid way...

As others have pointed out, only test[0] needs to be set - however, if you
really want all bytes 0, use:

memset(test, 0, sizeof test);
 
F

Fred L. Kleinschmidt

Rick said:
You're right, I'm better of with a good function. I fixed it and now it
works like the strncpy function, much better. But the string drame ain't
over, I got another questions. First of all, I noticed that all the string
functions I saw (I looked at string.h) need a pointer parameter so they can
write directly to it.

Not true! In fact, most of the string functions do NOT need a "pointer",
since they rarely modify the inputs. For example,
int strcmp(const char *s1, const char *s2);
Note that the args are const - thye do not require pointers; string
literals are just fine here (Note your example below trying to compare
"A" to "A").
I tried to make functions without that but then they
won't work anymore, an example :

char *test(){
char *s = "blabla";
return s;
} // result is, well, not readable

Make test a static variable so it stays in scope:
char *test(){
static char *s = "blabla";
return s;
}
But if I do
char *test( char *s ){
return s;
} // result is ok

It probably has to do with all the allocate stuff doesn't it? Or can't
string functions work without this parameter?
Another question, it's about strcmp. Now that subStr function is finally
working I want the result to be compared like this
char s[8];
subStr( "abcdef", 1,2,8 ); // result is "BC"
if ( strcmp( s, "BC" ) == 1) printf( "How amazing." );

I worked before with strcmp and it worked but now suddenly I can't get the
right result. Even if I do this
if ( strcmp( "A", "A" ) == 1) printf( "That just has to be right." );
It won't work. What's wrong with my input?

Greetings,
Rick

strcmp returns zero if the two input strings are equal.
 
M

Micah Cowan

Rick said:
Hi,

This is probably piece of cake for you C gurus but it is giving me a
headache. I'm still not really used with pointers and chars so many things
are going wrong. Practicing makes wonders but the problem is that I don't
have much time to practice. Ok, here's the question, how to reset a char
array?
I got this code :

char test[8] = "";

printf( subStr( "result = %s \n" , "blablabla" , 3,5, test ) );
printf( subStr( "result = %s \n" , "another string" , 3,5, test ) );

subStr is a selfmade function which get's a few chars out of the input
parameter and puts it in the output parameter (test in this case). The first
time I use it it works ok, but of course, the second time the test char
array will grow further instead of being replaces. So while the result
should be :
"bla"
"the"
I get
"bla"
"thebla"
It's because of subStr uses strcat and the second time I use it the test
array is still filled with some old stuff. How to get rid of that? I tried
free( test );
between those 2 but that didn't work.

free() is only meant to be used with pointers to blocks of memory
that were allocated with malloc() or calloc(). You can't use them
on statically or automatically allocated memory.

If your subStr() is intended to replace the current contents of
the string, it should set the first char of test to '\0' before
using strcat; or use strcpy/strncpy instead.
 
M

Micah Cowan

Fred L. Kleinschmidt said:
Not true! In fact, most of the string functions do NOT need a "pointer",
since they rarely modify the inputs. For example,
int strcmp(const char *s1, const char *s2);

See the *s? s1 and s2 above are called "pointers". I think I
understand what you meant, but please get the terminology
straight, so readers who may not know better don't propagate
the errors.
 
R

rihad

Make test a static variable so it stays in scope:
char *test(){
static char *s = "blabla";
return s;
}

What's wrong with the first version? Mind you, "static" means that s is static,
the string of chars being pointed at is already static. So the first version if
perfectly fine, or just

return "blabla";

they're all the same.
 
M

Mac

The above should be fine. Are you sure you didn't instead do:

Hmm. I'd have thought that "blabla" wouldn't be guaranteed to exist
outside of test. I gather from your reply, though, that it is? Is that
because "blabla" is a constant, and not an initializer (as it is below)?
char s[7] = "blabla";

as that would be wrong.

if ( strcmp( "A", "A" ) == 1) printf( "That just has to be right." );

Make that "== 0". See
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.14.html#strcmp

Ed.

Mac
--
 
B

Barry Schwarz

Hmm. I'd have thought that "blabla" wouldn't be guaranteed to exist
outside of test. I gather from your reply, though, that it is? Is that
because "blabla" is a constant, and not an initializer (as it is below)?

Yes. In this context, the quoted material is a string literal which
is defined as a static array of char. The static qualifier insures
that it exists for the entire life of the program, not just the life
of the function in which it appears.
char s[7] = "blabla";

as that would be wrong.

if ( strcmp( "A", "A" ) == 1) printf( "That just has to be right." );

Make that "== 0". See
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.14.html#strcmp

Ed.

Mac



<<Remove the del for email>>
 
E

Ed Morton

Mac said:
Hmm. I'd have thought that "blabla" wouldn't be guaranteed to exist
outside of test. I gather from your reply, though, that it is? Is that
because "blabla" is a constant, and not an initializer (as it is below)?

Pretty much. In the first version, s points to the area of memory where
"blabla" lives so when the function returns the value of "s" that value
still points to "blabla", while in the second the function stack
starting at location "s" gets a copy of "blabla" so when the function
returns the value of "s", it no longer points to a valid location since
the functions stack was already released. "blabla" cheerfully lives on
in memory in either case, but in the second you no longer have a pointer
to it, but instead a pointer to where a copy of it used to live. See
http://www.eskimo.com/~scs/C-faq/q6.2.html for a better general description.

Ed.
char s[7] = "blabla";
<snip>
 

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

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top