How to truncate char string fromt beginning and replace chars instring by other chars in C or C++?

H

Hongyu

Hi,

I have a datetime char string returned from ctime_r, and it is in the
format like ""Wed Jun 30 21:49:08 1993\n\0", which has 26 chars
including the last terminate char '\0', and i would like to remove the
weekday information that is "Wed" here, and I also would like to
replace the spaces char by "_" and also remove the "\n" char. I didn't
know how to truncate the string from beginning or replace some chars
in a string with another chars without using a loop through one char
by one char of the string. I used the below code to achieve
replacement of " " by "_" and also removed the last "\n" char, without
considering removing the first 4 chars i.e. weekday information yet.
But even this I still didn't get what i like. Below is the code i
wrote:


#include <time.h>
#include <stdio.h>

int main(void)
{
time_t ltime;
char buf[50];

// Get the time
time(&ltime);

// The datetime string returned by ctime_r is in the format
// of "Wed Jun 30 21:49:08 1993\n\0"
printf("The time is: %s", ctime_r(&ltime, buf));

// replace the " " and ":" in the datetime string
// by "_"
buf[7] = "_"; // " ", line 18
buf[10] = "_"; // " ", line 19
buf[13] = "_"; // ":", line 20
buf[16] = "_"; // ":", line 21
buf[19] = "_"; // " ", line 22
buf[24] = "\0"; // remove the last \n char, line 23

// printf the new datetimestring
printf("The time is: %s", buf);

}

When I complied it with gcc, i got the below warning:

test_ctimer.c: In function `main':
test_ctimer.c:18: warning: assignment makes integer from pointer
without a cast
and same warning for line 19 to 23 too.

When I run it, I got:

The time is: Thu Aug 7 15:02:32 2008
The time is: Thu AugX 7X15X02X32X2008Z

Can anyone kindly help me? I searched on the internet and it seems C
library doesn't have a function to truncate from the beginning? and it
also doesn't have a function for characher replacement. Should I have
to use a loop?

Thanks a lot for the help in advance.

Hongyu
 
H

Hongyu

Hongyu said:
I have a datetime char string returned from ctime_r,  and it is in the
format like ""Wed Jun 30 21:49:08 1993\n\0", which has 26 chars
including the last terminate char '\0', and i would like to remove the
weekday information that is "Wed" here, and I also would like to
replace the spaces char by "_" and also remove the "\n" char. I didn't
know how to truncate the string from beginning  or replace some chars
in a string with another chars without using a loop through one char
by one char of the string. I used the below code to achieve
replacement of " " by "_" and also removed the last "\n" char, without
considering removing the first 4 chars i.e. weekday information yet.
But even this I still didn't get what i like. Below is the code i
wrote:
#include <time.h>
#include <stdio.h>
int main(void)
{
   time_t ltime;
   char buf[50];
   // Get the time
   time(&ltime);
   // The datetime string returned by ctime_r is in the format
   // of "Wed Jun 30 21:49:08 1993\n\0"
   printf("The time is: %s", ctime_r(&ltime, buf));
   // replace the " " and ":" in the datetime string
   // by "_"
   buf[7] = "_";  // " ", line 18

For a single symbol you need to use single quotes:

     buf[7] = '_';

(same everywhere).
   buf[10] = "_"; // " ", line 19
   buf[13] = "_"; // ":", line 20
   buf[16] = "_"; // ":", line 21
   buf[19] = "_"; // " ", line 22
   buf[24] = "\0"; // remove the last \n char, line 23
   // printf the new datetimestring
   printf("The time is: %s", buf);

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask- Hide quoted text -

- Show quoted text -

Thanks a lot for the prompty help, Victor. It worked! The compiler
errors disappered and the space was replaced by '-'. Can you also tell
me how to remove the chars in the beginning of the string? and how to
remove a char inside the string, because i have one more space inside
the string and would like to remove it. I tried to use like:
buf[0]='', but got compiler errors like: test_ctimer.c:18:12: empty
character constant

Thanks a lot.
 
D

Default User

Hongyu wrote:

Thanks a lot for the prompty help, Victor. It worked! The compiler
errors disappered and the space was replaced by '-'. Can you also tell
me how to remove the chars in the beginning of the string? and how to
remove a char inside the string, because i have one more space inside
the string and would like to remove it. I tried to use like:
buf[0]='', but got compiler errors like: test_ctimer.c:18:12: empty
character constant

If you want to delete the contents and move the rest into place, you
either need to use memmove() or move the characters yourself.

See the example here:

http://www.cplusplus.com/reference/clibrary/cstring/memmove.html


If you just want to overwrite them with spaces, you use ' '.




Brian
 
H

Hongyu

Hongyu said:
Thanks a lot for the prompty help, Victor. It worked! The compiler
errors disappered and the space was replaced by '-'. Can you also tell
me how to remove the chars in the beginning of the string? and how to
remove a char inside the string, because i have one more space inside
the string and would like to remove it. I tried to use like:
buf[0]='', but got compiler errors like: test_ctimer.c:18:12: empty
character constant

If you want to delete the contents and move the rest into place, you
either need to use memmove() or move the characters yourself.

See the example here:

http://www.cplusplus.com/reference/clibrary/cstring/memmove.html

If you just want to overwrite them with spaces, you use ' '.

Brian

Thank you very much, Brian, "memmove can be very very useful", as the
link you provided mentioned, which is true. I will look at in more
detail and try it.
If you just want to overwrite them with spaces, you use ' '.

No, I would like to remove them. I will use memmove as you suggested.

Have a good rest of the day, everyone.
 
H

Hongyu

Hongyu said:
[..]  Can you also tell
me how to remove the chars in the beginning of the string? and how to
remove a char inside the string, because i have one more space inside
the string and would like to remove it. I tried to use like:
buf[0]='', but got compiler errors like: test_ctimer.c:18:12: empty
character constant

RTFM about 'memmove' function.  It should work with overlapping ranges.
  You can 'memmove' part of the string over itself, IIRC.

V

Thank you very much for the help again, Victor. I will try it.
 
H

Hongyu

No, I would like to remove them. I will use memmove as you suggested.

You don't need to move them at all. Just point to the first one you care about:

char text[] = "abcdefg";
char *last4 = text + 3;
std::cout << last4 << ;\n';

--
  Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Thanks a lot, Pete. You are right, I see it works in the way you
shown. But since I am a entry level person, so I am not quite sure if
I will need to use the truncated string somewhere else, like use it as
an argument to invocate a function, or return this truncated string as
my void truncatedString(char * string) function, or char*
truncatedString(char* inputString) function so that it can be used
somewhere else, will it still work? Please forgive my silly questions.
 
H

Hongyu

On 2008-08-07 16:56:42 -0400, Hongyu <[email protected]> said:
No, I would like to remove them. I will use memmove as you suggested.
You don't need to move them at all. Just point to the first one you care about:
char text[] = "abcdefg";
char *last4 = text + 3;
std::cout << last4 << ;\n';
--
  Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)
Thanks a lot, Pete. You are right, I see it works in the way you
shown. But since I am a entry level person, so I am not quite sure if
I will need to use the truncated string somewhere else, like use it as
an argument to invocate a function, or return this truncated string as
my void truncatedString(char * string) function, or char*
truncatedString(char* inputString) function so that it can be used
somewhere else, will it still work? Please forgive my silly questions.

Yes, it will work. A C-style string is just an array of char teminated
by a nul character. You can use a char* to point to the first character
that you're interested in: everything from that character out to the
nul character is still a char.

--
  Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)- Hide quoted text -

- Show quoted text -

Thanks Pete for the explanation and Glad to know that.

Have a good evening.
 
J

Jerry Coffin

Hi,

I have a datetime char string returned from ctime_r, and it is in the
format like ""Wed Jun 30 21:49:08 1993\n\0", which has 26 chars
including the last terminate char '\0', and i would like to remove the
weekday information that is "Wed" here, and I also would like to
replace the spaces char by "_" and also remove the "\n" char. I didn't
know how to truncate the string from beginning or replace some chars
in a string with another chars without using a loop through one char
by one char of the string. I used the below code to achieve
replacement of " " by "_" and also removed the last "\n" char, without
considering removing the first 4 chars i.e. weekday information yet.
But even this I still didn't get what i like. Below is the code i
wrote:

You've already gotten a number of answers to your original question, but
I think it's worth pointing out that if you want a time formatted in a
specific fashion, it may be easier to use strftime instead of time. If I
understand your requirement correctly, what you want looks something
like this:

char buf[50];
time_t ltime = time(NULL);

strftime(buf, sizeof(buf), "%b_%d_%H_%M_%S_%Y", localtime(&ltime);
 
J

James Kanze

You've already gotten a number of answers to your original
question, but I think it's worth pointing out that if you want
a time formatted in a specific fashion, it may be easier to
use strftime instead of time. If I understand your requirement
correctly, what you want looks something like this:
char buf[50];
time_t ltime = time(NULL);
strftime(buf, sizeof(buf), "%b_%d_%H_%M_%S_%Y", localtime(&ltime);

I was going to suggest that myself, if he's got access to the
tm (which may not be the case in his real code). Otherwise:

std::string result ;
std::replace_copy( buf + 4,
buf + strlen( buf ),
std::back_inserter( result ),
' ', '_' ) ;

will do everything he wants in one go. (If his input is a
string, of course, the first two arguments are
source.begin() + 4, source.end(). After checking that he has
at least 4 characters, of course.)
 

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,733
Messages
2,569,440
Members
44,832
Latest member
GlennSmall

Latest Threads

Top