473,395 Members | 1,652 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

reset char array

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
Nov 13 '05 #1
14 14358
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
Nov 13 '05 #2
In article <3f***********************@news.xs4all.nl>, Rick wrote:
[cut]
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.

--
Andreas Kähäri
Nov 13 '05 #3
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
Nov 13 '05 #4
In article <3f***********************@news.xs4all.nl>, Rick wrote:
[cut]
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.
--
Andreas Kähäri
Nov 13 '05 #5


On 10/24/2003 10:21 AM, Rick wrote:
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.

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


Make that "== 0". See
http://www.acm.uiuc.edu/webmonkeys/b...14.html#strcmp

Ed.

Nov 13 '05 #6
bd
Rick wrote:
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);
Nov 13 '05 #7


Rick wrote:

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.
--
Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Technical Architect, Common User Interface Services
M/S 2R-94 (206)544-5225
Nov 13 '05 #8
"Rick" <as******@hotmail.com> writes:
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.

--
Micah J. Cowan
mi***@cowan.name
Nov 13 '05 #9
"Fred L. Kleinschmidt" <fred.l.kleinschmidt@nospam_boeing.com> writes:
Rick wrote:

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


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.

--
Micah Cowan
mi***@cowan.name
Nov 13 '05 #10
On Fri, 24 Oct 2003 19:25:00 GMT, "Fred L. Kleinschmidt"
<fred.l.kleinschmidt@nospam_boeing.com> wrote:
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;
}


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.
Nov 13 '05 #11
Mac
On Fri, 24 Oct 2003 11:26:49 +0000, Ed Morton wrote:


On 10/24/2003 10:21 AM, Rick wrote:
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:


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.

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


Make that "== 0". See
http://www.acm.uiuc.edu/webmonkeys/b...14.html#strcmp

Ed.


Mac
--
Nov 13 '05 #12
On Sat, 25 Oct 2003 10:10:47 -0700, "Mac" <fo*@bar.net> wrote:
On Fri, 24 Oct 2003 11:26:49 +0000, Ed Morton wrote:


On 10/24/2003 10:21 AM, Rick wrote:
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:


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.

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


Make that "== 0". See
http://www.acm.uiuc.edu/webmonkeys/b...14.html#strcmp

Ed.


Mac


<<Remove the del for email>>
Nov 13 '05 #13


Mac wrote:
On Fri, 24 Oct 2003 11:26:49 +0000, Ed Morton wrote: <snip>
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:

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>

Nov 13 '05 #14
Million of answers, can't go wrong anymore! Thank you all!

Greetings,
Rick
Nov 13 '05 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: Ken | last post by:
How can I reset the initial form variables that are set with session statements when clicking on a button? I tried this but the function was not called: <?PHP function reset_form($none) {...
6
by: Shabam | last post by:
I have a text field that's pre-filled with data. Suppose the user edits it, but decides he wants to reset the data back to the original pre-filled data, how can I do that?
22
by: spike | last post by:
How do i reset a string? I just want to empty it som that it does not contain any characters Say it contains "hello world" at the time... I want it to contain "". Nothing that is.. Thanx
8
by: spike | last post by:
My prygram goes through a string to find names between '\'-characters The problem is, parts of the name in sTemp remains if the new name is shorter than the old name. code...
5
by: jab3 | last post by:
(again :)) Hello everyone. I'll ask this even at risk of being accused of not researching adequately. My question (before longer reasoning) is: How does declaring (or defining, whatever) a...
12
by: arkobose | last post by:
my earlier post titled: "How to input strings of any lengths into arrays of type: char *array ?" seems to have created a confusion. therefore i paraphrase my problem below. consider the...
3
by: Crirus | last post by:
I have a big array 512*512 elements Wich is the best way to reset the array to 0 on each element? Redim without preserve, I have for loop and clear shared function Wich one is best optimised for...
5
by: bdbeames | last post by:
I have and array that I fill with elements in a function. I call it later and want to reset it so that it is empty so I can fill it with different elements and a different number of elements. How...
4
by: JuAn2226 | last post by:
can anyone help me to to do coding for reset and start again. i got 10 array of random number, 10 array for start time how do i reset the both array after the 10 array is filled and start filling up...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.