473,908 Members | 3,296 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Hex to int

Thanks to everyone for interesting discussions. To make the group
happy, my next listing has int main and headers declared!!

Here is my solution to Exercise 2.3.

// write htoi, hex to int

#include<stdio. h>

int main(int c, char **v)
{
int x=-1, htoi();
if(c>1)
x=htoi(v[1]);
if(x>=0)
printf("%d\n", x);
else
printf("Unspeci fied error.\n");
}

int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {
if('0' <= *s && *s <= '9')
x+=y*(*s - '0');
else if('a' <= *s && *s <= 'f')
x+=y*(*s - 'a' + 10);
else if('A' <= *s && *s <= 'F')
x+=y*(10 + *s - 'A');
else
return -1; /* invalid input! */
y<<=4;
}
return x;
}
Dec 2 '07 #1
25 6070
ra****@thisisno tmyrealemail.co m writes:
Thanks to everyone for interesting discussions. To make the group
happy, my next listing has int main and headers declared!!

Here is my solution to Exercise 2.3.

// write htoi, hex to int

#include<stdio. h>

int main(int c, char **v)
The traditional names for the parameters to main() are argc and argv.
Using different names is legal, but a very bad idea; it just makes
your code more difficult to read.
{
int x=-1, htoi();
Putting a function declaration inside a function definition is legal,
but not a good idea. A function declaration with empty parentheses
says that the function takes a fixed but unspecied number and type(s)
of arguments.

Either declare htoi() with a full prototype at file scope (outside main()):

int htoi(char *s);

or move the full definition of htoi() above the definition of main(),
so you don't need a separate declaration.
if(c>1)
x=htoi(v[1]);
if(x>=0)
printf("%d\n", x);
else
printf("Unspeci fied error.\n");
Error messages are normally printed to stderr, not stdout.

You could detect the specific error of invoking main() with no
arguments. Consider something like this:

if (argc <= 1) {
fprintf(stderr, "Usage: %s arg\n", argv[0]);
exit(EXIT_FAILU RE);
}
}

int htoi(char *s)
Consider declaring this static, since it's not used from any other
translation units.
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {
if('0' <= *s && *s <= '9')
You can use the isdigit() function for this.
x+=y*(*s - '0');
else if('a' <= *s && *s <= 'f')
x+=y*(*s - 'a' + 10);
else if('A' <= *s && *s <= 'F')
x+=y*(10 + *s - 'A');
You're assuming that the numeric codes for the letters 'a'..'f' and
'A'..'F' are contiguous. This is not guaranteed, and there are
character sets where the alphabet is not contiguous (though in the one
example of this that I know of, 'a'..'f' and 'A'..'F' happen to be
contiguous). Consider using the isxdigit() function.
else
return -1; /* invalid input! */
y<<=4;
}
return x;
}
These are mostly superficial points. I'd take a closer look at the
algorithm, but your use of meaningless single-character identifiers
makes your code difficult to read.

--
Keith Thompson (The_Other_Keit h) <ks***@mib.or g>
Looking for software development work in the San Diego area.
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Dec 2 '07 #2
ra****@thisisno tmyrealemail.co m wrote, On 02/12/07 22:01:
Thanks to everyone for interesting discussions. To make the group
happy, my next listing has int main and headers declared!!
If your only reason for doing it is to keep the group happy then you
don't understand the issues and should reread what people have told you.
Either that or choose something other than programming.

Also you have *not* included all the required headers.
Here is my solution to Exercise 2.3.

// write htoi, hex to int

#include<stdio. h>
The space shortage ended some years back, so it will be easier to read
if you use some
#include <stdio.h>
int main(int c, char **v)
Conventionally the parameters are called argc and argv. Although other
names are legal it makes it easier for everyone if you use the
conventional names.
{
int x=-1, htoi();
Very bad style on two counts.
1) You have not used the prototype style of declaration so the compiler
cannot check the number and type of parameters passed to htoi.
2) It is generally considered better to not declare the functions
locally but globally, since they are visible globally. So it would be
better to put "int htoi(char *s);" at file scope or define htos prior to
main.
if(c>1)
x=htoi(v[1]);
if(x>=0)
printf("%d\n", x);
else
printf("Unspeci fied error.\n");
How about returning the value from main that the return type promisses
will be returned?
}

int htoi(char *s)
{
char *t=s;
int x=0, y=1;
Why not try using more than one character for variable names? It makes
it *far* easier to read if you use meaningful names.
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
You need string.h for strlen, without it your program invokes undefined
behaviour and could fail on some implementations , for example if size_t
(the return type of strlen) is 64 bits but int is only 32 bits.
while(t<=--s) {
if('0' <= *s && *s <= '9')
x+=y*(*s - '0');
else if('a' <= *s && *s <= 'f')
x+=y*(*s - 'a' + 10);
The letters are not guaranteed to be consecutive and one some systems
they are not.
else if('A' <= *s && *s <= 'F')
x+=y*(10 + *s - 'A');
else
return -1; /* invalid input! */
y<<=4;
None of the above handles overflow properly. Overflow of signed types
invokes undefined behaviour and might not (on some implementations will
not) do what you expect.
}
return x;
}
--
Flash Gordon
Dec 3 '07 #3
ra****@thisisno tmyrealemail.co m writes:
Here is my solution to Exercise 2.3.
<snip>

I'll comment only on the thing not yet pointed out...
int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {
This loop condition is likely to invoke undefined behaviour. Can you
see why?

--
Ben.
Dec 3 '07 #4
On Dec 3, 3:11 pm, Ben Bacarisse <ben.use...@bsb .me.ukwrote:
raj...@thisisno tmyrealemail.co m writes:
Here is my solution to Exercise 2.3.

<snip>

I'll comment only on the thing not yet pointed out...
int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {

This loop condition is likely to invoke undefined behaviour. Can you
see why?
If strlen(s) equals 0.
Dec 3 '07 #5
vi******@gmail. com writes:
On Dec 3, 3:11 pm, Ben Bacarisse <ben.use...@bsb .me.ukwrote:
>raj...@thisisn otmyrealemail.c om writes:
Here is my solution to Exercise 2.3.

<snip>

I'll comment only on the thing not yet pointed out...
int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {

This loop condition is likely to invoke undefined behaviour. Can you
see why?

If strlen(s) equals 0.
No. It can invoke UB when strlen(s) != 0 and it may not invoke UB in
some cases when strlen(s) == 0. Anyway, the question was partly
rhetorical. I think people learn better when they think, so I rather
hoped that my question would remain unanswered (at least for some while).

--
Ben.
Dec 3 '07 #6
RoS
In data Mon, 03 Dec 2007 13:11:05 +0000, Ben Bacarisse scrisse:
>rajash@thisisn otmyrealemail writes:
>Here is my solution to Exercise 2.3.
<snip>

I'll comment only on the thing not yet pointed out...
>int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {

This loop condition is likely to invoke undefined behaviour. Can you
see why?
is it because if s point to "" =strlen(s)==0; (s+=0)==s and --s
point to memory not allowed to change (or read)?
Dec 3 '07 #7
RoS <Ro*@not.existw rites:
In data Mon, 03 Dec 2007 13:11:05 +0000, Ben Bacarisse scrisse:
>>rajash@thisis notmyrealemail writes:
>>Here is my solution to Exercise 2.3.
<snip>

I'll comment only on the thing not yet pointed out...
>>int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {

This loop condition is likely to invoke undefined behaviour. Can you
see why?

is it because if s point to "" =strlen(s)==0; (s+=0)==s and --s
point to memory not allowed to change (or read)?
s pointing to "" and/or strlen(s) being zero has nothing to do with
it. Just consider a simple call like htoi("20") and work out what has
to happen for the while loop to stop.

Whenever I see a while loop, I negate the test in my head as ask "is
this condition safe?". When there is code after the loop you can
check that that code makes sense in an environment where the loop
condition is false (not significant in this case).

It gets a little messy when there are assignment operators (and
equivalents) in the test but it is still worth doing. In languages
like C, you have to scan the body for breaks, gotos and returns but
that is simple enough.

--
Ben.
Dec 3 '07 #8
Ben Bacarisse wrote:
ra****@thisisno tmyrealemail.co m writes:
Here is my solution to Exercise 2.3.
<snip>

I'll comment only on the thing not yet pointed out...
int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {

This loop condition is likely to invoke undefined behaviour. Can you
see why?
No.
Dec 3 '07 #9
ra****@thisisno tmyrealemail.co m wrote:
Ben Bacarisse wrote:
>ra****@thisisno tmyrealemail.co m writes:
>>Here is my solution to Exercise 2.3.
<snip>

I'll comment only on the thing not yet pointed out...
>>int htoi(char *s)
{
char *t=s;
int x=0, y=1;
if(*s=='0' && (s[1]=='x' || s[1]=='X'))
t+=2;
s+=strlen(s);
while(t<=--s) {
This loop condition is likely to invoke undefined behaviour. Can you
see why?

No.
For a string not prefixed by "0x" or "0X", what happens to s if t==s at
the time the loop condition is evaluated?
Dec 4 '07 #10

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

Similar topics

3
11272
by: William C. White | last post by:
Does anyone know of a way to use PHP /w Authorize.net AIM without using cURL? Our website is hosted on a shared drive and the webhost company doesn't installed additional software (such as cURL) on the server because of that. Our site will have an SSL certificate next week, so I would like to use AIM instead of SIM, however, I don't know how to send data via POST over https and recieve data from the Authorize.net server over an https...
2
5869
by: Albert Ahtenberg | last post by:
Hello, I don't know if it is only me but I was sure that header("Location:url") redirects the browser instantly to URL, or at least stops the execution of the code. But appearantely it continues to execute the code until the browser send his reply to the header instruction. So an exit(); after each redirection won't hurt at all
3
23057
by: James | last post by:
Hi, I have a form with 2 fields. 'A' 'B' The user completes one of the fields and the form is submitted. On the results page I want to run a query, but this will change subject to which field is completed.
0
8512
by: Ollivier Robert | last post by:
Hello, I'm trying to link PHP with Oracle 9.2.0/OCI8 with gcc 3.2.3 on a Solaris9 system. The link succeeds but everytime I try to run php, I get a SEGV from inside the libcnltsh.so library. 354 roberto@ausone:Build/php-4.3.2> ldd /opt/php4/bin/php libsablot.so.0 => /usr/local/lib/libsablot.so.0 libstdc++.so.5 => /usr/local/lib/libstdc++.so.5 libm.so.1 => /usr/lib/libm.so.1
1
8624
by: Richard Galli | last post by:
I want viewers to compare state laws on a single subject. Imagine a three-column table with a drop-down box on the top. A viewer selects a state from the list, and that state's text fills the column below. The viewer can select states from the drop down lists above the other two columns as well. If the viewer selects only one, only one column fills. If the viewer selects two states, two columns fill. Etc. I could, if appropriate, have...
4
18329
by: Albert Ahtenberg | last post by:
Hello, I have two questions. 1. When the user presses the back button and returns to a form he filled the form is reseted. How do I leave there the values he inserted? 2. When the user comes back to a page where he had a submitted POST data the browser keeps telling that the data has expired and asks if repost. How to avoid that? I tried registering all POST and GET vars as SESSION vars but
1
6896
by: inderjit S Gabrie | last post by:
Hi all Here is the scenerio ...is it possibly to do this... i am getting valid course dates output on to a web which i have designed ....all is okay so far , look at the following web url http://www.mis.gla.ac.uk/biquery/training/ but each of the courses held have maximum of 8 people that could be
2
31473
by: Jack | last post by:
Hi All, What is the PHP equivilent of Oracle bind variables in a SQL statement, e.g. select x from y where z=:parameter Which in asp/jsp would be followed by some statements to bind a value to :parameter I dont like the idea of making the SQL statement on the fly without binding parameters as I dont want a highly polluted SQL cache.
3
23622
by: Sandwick | last post by:
I am trying to change the size of a drawing so they are all 3x3. the script below is what i was trying to use to cut it in half ... I get errors. I can display the normal picture but not the results of the picture half the size. The PHP I have installed support 1.62 or higher. And all I would like to do is take and image and make it fit a 3x3. Any suggestions to where I should read or look would be appreciated.
0
9875
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
11334
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10911
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 tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8092
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
7240
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
6131
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4762
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4333
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3352
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.