convert decimal number in a hexadecimal number ?

M

muss

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

CoL

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

}
 
V

Vladimir S. Oka

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 said:
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
not copy and paste your code, but retyped it -- badly.

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).
 
C

CoL

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

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 said:
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.

^
Syntax error: missing ';'.


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

Richard Heathfield

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

Vladimir S. Oka

CoL said:
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...???

The answers should...
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.

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

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*
 
C

CBFalconer

CoL said:
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
"Reply" at the bottom of the article headers." - Keith Thompson
More details at: <http://cfaj.freeshell.org/google/>
Also see <http://www.safalra.com/special/googlegroupsreply/>
 
V

Vladimir S. Oka

CoL wrote:


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


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
C++/C99 style comments, and added missing ';'):

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


--
BR, Vladimir

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

Rod Pemberton

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
read only server:

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


Rod Pemberton
 
M

Mark McIntyre

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
 
D

Dave Thompson

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.
a) Why 30?
b) Isn't it clearer to put initialisation into `for`?
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.

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
 
V

Vladimir S. Oka

Dave Thompson opined:
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.
a) Why 30?
b) Isn't it clearer to put initialisation into `for`?
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.


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!
 

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

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,736
Latest member
AdolphBig6

Latest Threads

Top