How to convert the number 0 with strtol? [duplicate]
This question already has an answer here:
How to use `strtoul` to parse string where zero may be valid?
4 answers
I need strtol to convert some numbers from a range of [0 to 255]
how can I check the conversion of 0 if 0 is also a number that i need to convert?
long conv = strtol(argv, &p, 10);
if (conv == 0)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
if ((conv >= LONG_MAX || conv <= LONG_MIN) && errno == 34);
{
perror("Invalid Range!");
exit(EXIT_FAILURE);
}
c
marked as duplicate by Sourav Ghosh
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 2 at 16:02
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
How to use `strtoul` to parse string where zero may be valid?
4 answers
I need strtol to convert some numbers from a range of [0 to 255]
how can I check the conversion of 0 if 0 is also a number that i need to convert?
long conv = strtol(argv, &p, 10);
if (conv == 0)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
if ((conv >= LONG_MAX || conv <= LONG_MIN) && errno == 34);
{
perror("Invalid Range!");
exit(EXIT_FAILURE);
}
c
marked as duplicate by Sourav Ghosh
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 2 at 16:02
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
4
Holy crap, that function really does use zero as a signaling value. Whose idea was that?
– Robert Harvey♦
Jan 2 at 16:00
2
check if p is different from argv
– Ôrel
Jan 2 at 16:01
Actually, I think zero is just the default return value if it cannot parse the string.
– Robert Harvey♦
Jan 2 at 16:04
Unknown, @Ôrel comments correctly. Afterstrtol(argv, &p, 10),if (argv == p) perror("Conversion error");
– chux
Jan 2 at 19:20
add a comment |
This question already has an answer here:
How to use `strtoul` to parse string where zero may be valid?
4 answers
I need strtol to convert some numbers from a range of [0 to 255]
how can I check the conversion of 0 if 0 is also a number that i need to convert?
long conv = strtol(argv, &p, 10);
if (conv == 0)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
if ((conv >= LONG_MAX || conv <= LONG_MIN) && errno == 34);
{
perror("Invalid Range!");
exit(EXIT_FAILURE);
}
c
This question already has an answer here:
How to use `strtoul` to parse string where zero may be valid?
4 answers
I need strtol to convert some numbers from a range of [0 to 255]
how can I check the conversion of 0 if 0 is also a number that i need to convert?
long conv = strtol(argv, &p, 10);
if (conv == 0)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
if ((conv >= LONG_MAX || conv <= LONG_MIN) && errno == 34);
{
perror("Invalid Range!");
exit(EXIT_FAILURE);
}
This question already has an answer here:
How to use `strtoul` to parse string where zero may be valid?
4 answers
c
c
edited Jan 2 at 16:08
4386427
21.8k31846
21.8k31846
asked Jan 2 at 15:58
UnknownUnknown
245
245
marked as duplicate by Sourav Ghosh
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 2 at 16:02
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Sourav Ghosh
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 2 at 16:02
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
4
Holy crap, that function really does use zero as a signaling value. Whose idea was that?
– Robert Harvey♦
Jan 2 at 16:00
2
check if p is different from argv
– Ôrel
Jan 2 at 16:01
Actually, I think zero is just the default return value if it cannot parse the string.
– Robert Harvey♦
Jan 2 at 16:04
Unknown, @Ôrel comments correctly. Afterstrtol(argv, &p, 10),if (argv == p) perror("Conversion error");
– chux
Jan 2 at 19:20
add a comment |
4
Holy crap, that function really does use zero as a signaling value. Whose idea was that?
– Robert Harvey♦
Jan 2 at 16:00
2
check if p is different from argv
– Ôrel
Jan 2 at 16:01
Actually, I think zero is just the default return value if it cannot parse the string.
– Robert Harvey♦
Jan 2 at 16:04
Unknown, @Ôrel comments correctly. Afterstrtol(argv, &p, 10),if (argv == p) perror("Conversion error");
– chux
Jan 2 at 19:20
4
4
Holy crap, that function really does use zero as a signaling value. Whose idea was that?
– Robert Harvey♦
Jan 2 at 16:00
Holy crap, that function really does use zero as a signaling value. Whose idea was that?
– Robert Harvey♦
Jan 2 at 16:00
2
2
check if p is different from argv
– Ôrel
Jan 2 at 16:01
check if p is different from argv
– Ôrel
Jan 2 at 16:01
Actually, I think zero is just the default return value if it cannot parse the string.
– Robert Harvey♦
Jan 2 at 16:04
Actually, I think zero is just the default return value if it cannot parse the string.
– Robert Harvey♦
Jan 2 at 16:04
Unknown, @Ôrel comments correctly. After
strtol(argv, &p, 10), if (argv == p) perror("Conversion error");– chux
Jan 2 at 19:20
Unknown, @Ôrel comments correctly. After
strtol(argv, &p, 10), if (argv == p) perror("Conversion error");– chux
Jan 2 at 19:20
add a comment |
1 Answer
1
active
oldest
votes
Prior to calling strtol, set errno to 0.
Then after the call, check the value of errno. If it's 0, you know the call was successful. Addtionally, you'll want to check if *p is 0. If so, that means the entire string was parsed successfully with no extra characters.
errno = 0;
long conv = strtol(argv, &p, 10);
if (errno)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
else if (*p)
{
perror("Not all characters converted");
exit(EXIT_FAILURE);
}
The man page also mentions this in the "Notes" section:
Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN
(LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure,
the calling
program should set errno to 0 before the call, and then determine if an error occurred by checking whether errno has a nonzero
value after the
call.
thank you. that helps
– Unknown
Jan 2 at 16:15
1
I'm not sure it is required thaterrnois set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't seterrnoideone.com/T3ddyH . I think you need to compareargvandpto catch the case with no conversion
– 4386427
Jan 2 at 16:36
The C standard has no requirements abouterrnowhen conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should checkif (argv == p)for the no conversion condition.
– chux
Jan 2 at 19:25
@chux The code I've posted should account for all error cases, whether or noterrno is set toEINVAL. It both checkserrno` and check thatppoints to the end of the string to test for a complete conversion.
– dbush
Jan 2 at 19:30
Iferrnowas not set bystrtol()on a non-conversion (which is compliant with the C standard), this code would errantly not complain aboutstrtol("", &p, 10);
– chux
Jan 2 at 22:02
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Prior to calling strtol, set errno to 0.
Then after the call, check the value of errno. If it's 0, you know the call was successful. Addtionally, you'll want to check if *p is 0. If so, that means the entire string was parsed successfully with no extra characters.
errno = 0;
long conv = strtol(argv, &p, 10);
if (errno)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
else if (*p)
{
perror("Not all characters converted");
exit(EXIT_FAILURE);
}
The man page also mentions this in the "Notes" section:
Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN
(LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure,
the calling
program should set errno to 0 before the call, and then determine if an error occurred by checking whether errno has a nonzero
value after the
call.
thank you. that helps
– Unknown
Jan 2 at 16:15
1
I'm not sure it is required thaterrnois set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't seterrnoideone.com/T3ddyH . I think you need to compareargvandpto catch the case with no conversion
– 4386427
Jan 2 at 16:36
The C standard has no requirements abouterrnowhen conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should checkif (argv == p)for the no conversion condition.
– chux
Jan 2 at 19:25
@chux The code I've posted should account for all error cases, whether or noterrno is set toEINVAL. It both checkserrno` and check thatppoints to the end of the string to test for a complete conversion.
– dbush
Jan 2 at 19:30
Iferrnowas not set bystrtol()on a non-conversion (which is compliant with the C standard), this code would errantly not complain aboutstrtol("", &p, 10);
– chux
Jan 2 at 22:02
add a comment |
Prior to calling strtol, set errno to 0.
Then after the call, check the value of errno. If it's 0, you know the call was successful. Addtionally, you'll want to check if *p is 0. If so, that means the entire string was parsed successfully with no extra characters.
errno = 0;
long conv = strtol(argv, &p, 10);
if (errno)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
else if (*p)
{
perror("Not all characters converted");
exit(EXIT_FAILURE);
}
The man page also mentions this in the "Notes" section:
Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN
(LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure,
the calling
program should set errno to 0 before the call, and then determine if an error occurred by checking whether errno has a nonzero
value after the
call.
thank you. that helps
– Unknown
Jan 2 at 16:15
1
I'm not sure it is required thaterrnois set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't seterrnoideone.com/T3ddyH . I think you need to compareargvandpto catch the case with no conversion
– 4386427
Jan 2 at 16:36
The C standard has no requirements abouterrnowhen conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should checkif (argv == p)for the no conversion condition.
– chux
Jan 2 at 19:25
@chux The code I've posted should account for all error cases, whether or noterrno is set toEINVAL. It both checkserrno` and check thatppoints to the end of the string to test for a complete conversion.
– dbush
Jan 2 at 19:30
Iferrnowas not set bystrtol()on a non-conversion (which is compliant with the C standard), this code would errantly not complain aboutstrtol("", &p, 10);
– chux
Jan 2 at 22:02
add a comment |
Prior to calling strtol, set errno to 0.
Then after the call, check the value of errno. If it's 0, you know the call was successful. Addtionally, you'll want to check if *p is 0. If so, that means the entire string was parsed successfully with no extra characters.
errno = 0;
long conv = strtol(argv, &p, 10);
if (errno)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
else if (*p)
{
perror("Not all characters converted");
exit(EXIT_FAILURE);
}
The man page also mentions this in the "Notes" section:
Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN
(LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure,
the calling
program should set errno to 0 before the call, and then determine if an error occurred by checking whether errno has a nonzero
value after the
call.
Prior to calling strtol, set errno to 0.
Then after the call, check the value of errno. If it's 0, you know the call was successful. Addtionally, you'll want to check if *p is 0. If so, that means the entire string was parsed successfully with no extra characters.
errno = 0;
long conv = strtol(argv, &p, 10);
if (errno)
{
perror("Conversion error");
exit(EXIT_FAILURE);
}
else if (*p)
{
perror("Not all characters converted");
exit(EXIT_FAILURE);
}
The man page also mentions this in the "Notes" section:
Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN
(LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure,
the calling
program should set errno to 0 before the call, and then determine if an error occurred by checking whether errno has a nonzero
value after the
call.
edited Jan 2 at 17:32
answered Jan 2 at 16:00
dbushdbush
102k13108144
102k13108144
thank you. that helps
– Unknown
Jan 2 at 16:15
1
I'm not sure it is required thaterrnois set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't seterrnoideone.com/T3ddyH . I think you need to compareargvandpto catch the case with no conversion
– 4386427
Jan 2 at 16:36
The C standard has no requirements abouterrnowhen conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should checkif (argv == p)for the no conversion condition.
– chux
Jan 2 at 19:25
@chux The code I've posted should account for all error cases, whether or noterrno is set toEINVAL. It both checkserrno` and check thatppoints to the end of the string to test for a complete conversion.
– dbush
Jan 2 at 19:30
Iferrnowas not set bystrtol()on a non-conversion (which is compliant with the C standard), this code would errantly not complain aboutstrtol("", &p, 10);
– chux
Jan 2 at 22:02
add a comment |
thank you. that helps
– Unknown
Jan 2 at 16:15
1
I'm not sure it is required thaterrnois set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't seterrnoideone.com/T3ddyH . I think you need to compareargvandpto catch the case with no conversion
– 4386427
Jan 2 at 16:36
The C standard has no requirements abouterrnowhen conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should checkif (argv == p)for the no conversion condition.
– chux
Jan 2 at 19:25
@chux The code I've posted should account for all error cases, whether or noterrno is set toEINVAL. It both checkserrno` and check thatppoints to the end of the string to test for a complete conversion.
– dbush
Jan 2 at 19:30
Iferrnowas not set bystrtol()on a non-conversion (which is compliant with the C standard), this code would errantly not complain aboutstrtol("", &p, 10);
– chux
Jan 2 at 22:02
thank you. that helps
– Unknown
Jan 2 at 16:15
thank you. that helps
– Unknown
Jan 2 at 16:15
1
1
I'm not sure it is required that
errno is set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't set errno ideone.com/T3ddyH . I think you need to compare argv and p to catch the case with no conversion– 4386427
Jan 2 at 16:36
I'm not sure it is required that
errno is set when no conversion is done. The man page says: "The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned)." and the standard only mentions ERANGE as errno in case of over/underflow. This example doesn't set errno ideone.com/T3ddyH . I think you need to compare argv and p to catch the case with no conversion– 4386427
Jan 2 at 16:36
The C standard has no requirements about
errno when conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should check if (argv == p) for the no conversion condition.– chux
Jan 2 at 19:25
The C standard has no requirements about
errno when conversion fails (only range issues). The Linux man page is inconsistent with the C spec on this point. Code should check if (argv == p) for the no conversion condition.– chux
Jan 2 at 19:25
@chux The code I've posted should account for all error cases, whether or not
errno is set to EINVAL. It both checks errno` and check that p points to the end of the string to test for a complete conversion.– dbush
Jan 2 at 19:30
@chux The code I've posted should account for all error cases, whether or not
errno is set to EINVAL. It both checks errno` and check that p points to the end of the string to test for a complete conversion.– dbush
Jan 2 at 19:30
If
errno was not set by strtol() on a non-conversion (which is compliant with the C standard), this code would errantly not complain about strtol("", &p, 10);– chux
Jan 2 at 22:02
If
errno was not set by strtol() on a non-conversion (which is compliant with the C standard), this code would errantly not complain about strtol("", &p, 10);– chux
Jan 2 at 22:02
add a comment |
4
Holy crap, that function really does use zero as a signaling value. Whose idea was that?
– Robert Harvey♦
Jan 2 at 16:00
2
check if p is different from argv
– Ôrel
Jan 2 at 16:01
Actually, I think zero is just the default return value if it cannot parse the string.
– Robert Harvey♦
Jan 2 at 16:04
Unknown, @Ôrel comments correctly. After
strtol(argv, &p, 10),if (argv == p) perror("Conversion error");– chux
Jan 2 at 19:20