# convert decimal number in a hexadecimal number ?

Discussion in 'C Programming' started by muss, Mar 16, 2006.

1. ### mussGuest

how to convert decimal number in a hexadecimal number using C?
Thanks.

muss, Mar 16, 2006

2. ### Ian CollinsGuest

muss wrote:
> how to convert decimal number in a hexadecimal number using C?
> Thanks.
>

What have you tried?

--
Ian Collins.

Ian Collins, Mar 16, 2006

3. ### CoLGuest

This solves ur problem...

#include<stdio.h>

//function to convert a value to the desired base binary,oct,Hex
char* itoa(int val, int base){

static char buf[32] = {0};

int i = 30;

for(; val && i ; --i, val /= base)

buf = "0123456789abcdef"[val % base]; //its a c way to
pick up that particular index value that is in [].

return &buf[i+1];

}

int main()
{

char c;
char* p,*q
p=itoa(8,8);
q=itoa(8,2);
printf("%s",p);
printf("%s",p);

}

muss wrote:
> how to convert decimal number in a hexadecimal number using C?
> Thanks.

CoL, Mar 16, 2006

On Thursday 16 March 2006 05:58, muss opined (in
<>):

> how to convert decimal number in a hexadecimal number using C?

--

Friction is a drag.

Vladimir S. Oka, Mar 16, 2006

On Thursday 16 March 2006 07:48, CoL opined (in
<>):
> muss wrote:
>> how to convert decimal number in a hexadecimal number using C?
>> Thanks.

>
> This solves ur problem...

No, it does not, as it doesn't work (even when all syntax errors are
corected).

Also, don't top-post (corrected here).

> #include<stdio.h>
>
> //function to convert a value to the desired base binary,oct,Hex

(Don't use `//` when posting to Usenet.)

> char* itoa(int val, int base){

You never check that inputs are valid.

> static char buf[32] = {0};

Are you sure 31 characters is enough for a 256-bit int on DS9K?

> int i = 30;

a) Why 30?
b) Isn't it clearer to put initialisation into `for`?

> for(; val && i ; --i, val /= base)
>
> buf = "0123456789abcdef"[val % base]; //its a c way to
> pick up that particular index value that is in [].

Obfuscated C Contest is at <www.ioccc.org>.

>
> return &buf[i+1];
> }
>
> int main()

It's:

int main(void)

Spell out what you mean.

> {
>
> char c;
> char* p,*q

^
Syntax error: missing ';'.

> p=itoa(8,8);
> q=itoa(8,2);
> printf("%s",p);
> printf("%s",p);

You need '\n' at the end of `printf` for anything to be output. You also
never output string pointed to by `q`. Do you think it's guaranteed
that the same memory will be allocated to `buf` on the second
invocation of `itoa`? If you do, you are mistaken. More likely you did

Also:

return 0;

Would've been nice (although not required in C99).

> }

Once corrected, when I run it, I get:

00
00

Which is incorrect.

As OP's question sounds like a homework assignment, I'll leave it to two
of you to correct this (or come up with something different).

--

Those who in quarrels interpose, must often wipe a bloody nose.

Vladimir S. Oka, Mar 16, 2006
6. ### CoLGuest

Who the hell is this Vladimir.....???????
I just gave him a hint of solution....
My fuction char* itoa(int val, int base) is perfectly right ..it
accepts only one input at a time so in main I gave two different inputs
first try itoa(8,8)base 8..then
itoa(8,2)base 2, not both same time...U will see the perfect answers.
and this is hint not a narration of exact program given with a
intention the the one who raised this problem can modify this according
to his requirements.

Do you think all mails posted in the groups contain exact perfect
optimised and performant code...???

> On Thursday 16 March 2006 07:48, CoL opined (in
> <>):
> > muss wrote:
> >> how to convert decimal number in a hexadecimal number using C?
> >> Thanks.

> >
> > This solves ur problem...

>
> No, it does not, as it doesn't work (even when all syntax errors are
> corected).
>
> Also, don't top-post (corrected here).
>
> > #include<stdio.h>
> >
> > //function to convert a value to the desired base binary,oct,Hex

>
> (Don't use `//` when posting to Usenet.)
>
> > char* itoa(int val, int base){

>
> You never check that inputs are valid.
>
> > static char buf[32] = {0};

>
> Are you sure 31 characters is enough for a 256-bit int on DS9K?
>
> > int i = 30;

>
> a) Why 30?
> b) Isn't it clearer to put initialisation into `for`?
>
> > for(; val && i ; --i, val /= base)
> >
> > buf = "0123456789abcdef"[val % base]; //its a c way to
> > pick up that particular index value that is in [].

>
> Obfuscated C Contest is at <www.ioccc.org>.
>
> >
> > return &buf[i+1];
> > }
> >
> > int main()

>
> It's:
>
> int main(void) //this is wrong...

its:
int main(int argc, char** argv)
>
> Spell out what you mean.
>
> > {
> >
> > char c;
> > char* p,*q

> ^
> Syntax error: missing ';'.
>
> > p=itoa(8,8);
> > q=itoa(8,2);
> > printf("%s",p);
> > printf("%s",p);

>
> You need '\n' at the end of `printf` for anything to be output. You also
> never output string pointed to by `q`. Do you think it's guaranteed
> that the same memory will be allocated to `buf` on the second
> invocation of `itoa`? If you do, you are mistaken. More likely you did
> not copy and paste your code, but retyped it -- badly.

> ///what crap you trying to make ??

> Also:
>
> return 0;
>
> Would've been nice (although not required in C99).
>
> > }

>
> Once corrected, when I run it, I get:
>
> 00
> 00
>
> Which is incorrect.
>
> As OP's question sounds like a homework assignment, I'll leave it to two
> of you to correct this (or come up with something different).
>
> --
>
> Those who in quarrels interpose, must often wipe a bloody nose.

CoL, Mar 16, 2006
7. ### Richard HeathfieldGuest

CoL said:

> Who the hell is this Vladimir.....???????

A guy that pointed out some errors in your code, it seems.

> I just gave him a hint of solution....

And Vladimir gave you some hints on how to make it better.

> My fuction char* itoa(int val, int base) is perfectly right ..

The original doesn't appear to have reached my server (at least not yet).
I'd be glad to look it over if you want a second opinion and are prepared
to post it again. But if Vladimir says it's broken, I'm inclined to believe
him. He certainly has a tendency to be right more often than not.

> Do you think all mails posted in the groups contain exact perfect
> optimised and performant code...???

Of course they don't. But they ought to, if they are being presented as
solutions rather than questions. Or at least, if short cuts /have/ been
taken, these should be made explicit, perhaps with a brief comment.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)

Richard Heathfield, Mar 16, 2006

CoL wrote:
> Who the hell is this Vladimir.....???????

You are being rude...

(A: Someone not afraid to show his full name.)

> I just gave him a hint of solution....
> My fuction char* itoa(int val, int base) is perfectly right ..it

You're not telling the truth...

> Do you think all mails posted in the groups contain exact perfect
> optimised and performant code...???

> > On Thursday 16 March 2006 07:48, CoL opined (in
> > <>):
> > >
> > > int main()

> >
> > It's:
> >
> > int main(void) //this is wrong...

> its:
> int main(int argc, char** argv)

....and you don't really know C.

FYI, it can be both:

int main(void)
int main(int argc, char *argv[])
or anything that an implementation cares to define

Your

int main()

is close, but not exactly the same as the first one above.

> > > printf("%s",p);
> > > printf("%s",p);

> >
> > You need '\n' at the end of `printf` for anything to be output. You also

>
> > ///what crap you trying to make ??

That's being rude twice, and that's twice too many times...

> > Once corrected, when I run it, I get:
> >
> > 00
> > 00
> >
> > Which is incorrect.

Care to dispute this with the output of your code? If you do, please
post *exact* code that you compiled and ran, together with it's output.

That way someone may be able to check your claims (but beware the sig).
I won't, as I won't be reading any more of your posts. Goodbye.

*PLONK*

--

Those who in quarrels interpose, must often wipe a bloody nose.

Vladimir S. Oka, Mar 16, 2006
9. ### CBFalconerGuest

CoL wrote:
>
> Who the hell is this Vladimir.....???????
> I just gave him a hint of solution....
> My fuction char* itoa(int val, int base) is perfectly right ..it
> accepts only one input at a time so in main I gave two different inputs
> first try itoa(8,8)base 8..then
> itoa(8,2)base 2, not both same time...U will see the perfect answers.
> and this is hint not a narration of exact program given with a
> intention the the one who raised this problem can modify this according
> to his requirements.
>
> Do you think all mails posted in the groups contain exact perfect
> optimised and performant code...???

Don't toppost. Do quote relative portions, and snip
irrelevancies. Ignoring your rudeness, poor spelling, poor
punctuation, and lacking proper code to criticize, we can say
little more, except that yes, we do expect code to be correct, but
not optimized.

--
"If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the

CBFalconer, Mar 16, 2006

On Thursday 16 March 2006 10:53, Vladimir S. Oka opined (in
<>):
> CoL wrote:

<snip>

>> > On Thursday 16 March 2006 07:48, CoL opined (in
>> > <>):

<snip>

>> > > printf("%s",p);
>> > > printf("%s",p);
>> >
>> > You need '\n' at the end of `printf` for anything to be output. You
>> > also

>>
>> > ///what crap you trying to make ??

>
> That's being rude twice, and that's twice too many times...
>
>> > Once corrected, when I run it, I get:
>> >
>> > 00
>> > 00
>> >
>> > Which is incorrect.

>
> Care to dispute this with the output of your code? If you do, please
> post *exact* code that you compiled and ran, together with it's
> output.

FWIW, here's the code from CoL's original post, in its unadulterated
incorrectness (I've only reduced spacing, mostly vertical, and removed

#include<stdio.h>

/* function to convert a value to the desired base binary,oct,Hex */
char* itoa(int val, int base){

static char buf[32] = {0};

int i = 30;

for(; val && i ; --i, val /= base)
buf = "0123456789abcdef"[val % base]; /* its a c way to
pick up that particular index value that is in []. */

return &buf[i+1];
}

int main()
{
char c;
char* p,*q; /* VSO added ';' */
p=itoa(8,8);
q=itoa(8,2);
printf("%s",p);
printf("%s",p);
}

--

We are not loved by our friends for what we are;
rather, we are loved in spite of what we are.
-- Victor Hugo

Vladimir S. Oka, Mar 16, 2006
11. ### Rod PembertonGuest

"Richard Heathfield" <> wrote in message
news:dvbf6l\$sin\$-infra.bt.com...

> The original doesn't appear to have reached my server (at least not yet).

I've noticed you've had a number of problems with this. Try another open

freenews.netfront.net
news.hdrc.edu.tw
nntp.aioe.org

Rod Pemberton

Rod Pemberton, Mar 16, 2006
12. ### Mark McIntyreGuest

On 16 Mar 2006 02:29:42 -0800, in comp.lang.c , "CoL"
<> wrote:

>Who the hell is this Vladimir.....???????

A regular contributor to CLC.

>I just gave him a hint of solution....

and he pointed out a bunch of errors in your code.

>My fuction char* itoa(int val, int base) is perfectly right

Since when is 8 in base eight "00" but also "00" in base 2?

>itoa(8,2)base 2, not both same time...U will see the perfect answers.

I see. Your code was actually two different programmes merged into
one. Very helpful to the OP, who will have had no clue how to decipher
such gibberish.

>and this is hint not a narration of exact program

Actually it now looks a lot like code posted by a ninny trying to be
smugly superior.

>Do you think all mails posted in the groups contain exact perfect
>optimised and performant code...???

No, but if you post b*llocks disguised as solutions to problems,
expect people to pick holes in it.
Mark McIntyre
--
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it."
--Brian Kernighan

Mark McIntyre, Mar 16, 2006
13. ### Dave ThompsonGuest

On Thu, 16 Mar 2006 08:09:44 +0000 (UTC), "Vladimir S. Oka"
<> wrote:

> On Thursday 16 March 2006 07:48, CoL opined (in
> <>):

> > char* itoa(int val, int base){

>

I would make base unsigned, and probably val also.

> You never check that inputs are valid.
>

Neither do standard library routines in most cases. There are
arguments on both sides, and (IMO properly) different decisions in
different situations and usages.

> > static char buf[32] = {0};

>
> Are you sure 31 characters is enough for a 256-bit int on DS9K?
>

That's a fair point. Although easily fixed.

> > int i = 30;

>
> a) Why 30?
> b) Isn't it clearer to put initialisation into `for`?
>
> > for(; val && i ; --i, val /= base)
> >

Test-at-top means that value 0 is output as no digits (an empty
string). While mathematically defensible, this is not what most people
usually want. Test-at-bottom is one fix; another is an override (or
digits_so_far == 0) which can be extended to the additional and often
useful functionality (or digits_so_far < min_digits).

> > buf = "0123456789abcdef"[val % base]; //its a c way to
> > pick up that particular index value that is in [].

>
> Obfuscated C Contest is at <www.ioccc.org>.
>

I don't consider that obfuscated. If you don't understand that C
character strings, and particularly literal ones, are actually array
of char, you're in big trouble; and if you do, I think that is obvious
and admirably terse. (val % base) ["digits"] would be obfuscated.

The doubleslash comment doesn't add anything though.

<snip>
> You need '\n' at the end of `printf` for anything to be output. You also
> never output string pointed to by `q`. Do you think it's guaranteed
> that the same memory will be allocated to `buf` on the second
> invocation of `itoa`? If you do, you are mistaken. More likely you did
> not copy and paste your code, but retyped it -- badly.
>

Since he declared buf static, it certainly will remain allocated at
the same place throughout the program's entire execution.

> Once corrected, when I run it, I get:
>
> 00
> 00
>
> Which is incorrect.
>

After fixing the buffer reuse I get 10 and 1000 as expected.

- David.Thompson1 at worldnet.att.net

Dave Thompson, Mar 27, 2006

Dave Thompson opined:

> On Thu, 16 Mar 2006 08:09:44 +0000 (UTC), "Vladimir S. Oka"
> <> wrote:
>
>> On Thursday 16 March 2006 07:48, CoL opined (in
>> <>):

>
>> > char* itoa(int val, int base){

>>

> I would make base unsigned, and probably val also.
>
>> You never check that inputs are valid.
>>

> Neither do standard library routines in most cases. There are
> arguments on both sides, and (IMO properly) different decisions in
> different situations and usages.
>
>> > static char buf[32] = {0};

>>
>> Are you sure 31 characters is enough for a 256-bit int on DS9K?
>>

> That's a fair point. Although easily fixed.
>
>> > int i = 30;

>>
>> a) Why 30?
>> b) Isn't it clearer to put initialisation into `for`?
>>
>> > for(; val && i ; --i, val /= base)
>> >

> Test-at-top means that value 0 is output as no digits (an empty
> string). While mathematically defensible, this is not what most
> people usually want. Test-at-bottom is one fix; another is an
> override (or digits_so_far == 0) which can be extended to the
> additional and often useful functionality (or digits_so_far <
> min_digits).
>
>> > buf = "0123456789abcdef"[val % base]; //its a c way
>> > to
>> > pick up that particular index value that is in [].

>>
>> Obfuscated C Contest is at <www.ioccc.org>.
>>

> I don't consider that obfuscated. If you don't understand that C
> character strings, and particularly literal ones, are actually array
> of char, you're in big trouble; and if you do, I think that is
> obvious and admirably terse. (val % base) ["digits"] would be
> obfuscated.

OK, not exactly obfuscated, but does derail (at least mine) thinking
process when reading the code. Also, makes it unnecessarily difficult
to modify the function to support base 36 numbers (which I failed to
mention originally).

> The doubleslash comment doesn't add anything though.
>
> <snip>
>> You need '\n' at the end of `printf` for anything to be output. You
>> also never output string pointed to by `q`. Do you think it's
>> guaranteed that the same memory will be allocated to `buf` on the
>> second invocation of `itoa`? If you do, you are mistaken. More
>> likely you did not copy and paste your code, but retyped it --
>>

> Since he declared buf static, it certainly will remain allocated at
> the same place throughout the program's entire execution.

I admit I managed not to see `static`. Thanks!

>> Once corrected, when I run it, I get:
>>
>> 00
>> 00
>>
>> Which is incorrect.
>>

> After fixing the buffer reuse I get 10 and 1000 as expected.
>
> - David.Thompson1 at worldnet.att.net

--

There's a fine line between courage and foolishness.
Too bad it's not a fence.

Vladimir S. Oka, Mar 27, 2006