将字符串转换为数字
Convert string into number
我了解到可以使用 sprintf
:
将数字转换为字符串
int main()
{
int n;
char s[32];
printf("n=");
scanf("%d",&n);
sprintf(s,"%d",n); //HERE
puts(s);
return 0;
}
是否可以使用类似的命令将字符串转换为数字,而不检查每个字符是否为数字?
是的。您可以使用 strtol
函数。
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
strtol
将 nptr
指向的字符串的初始部分转换为 long int
表示。
最好不要使用 atoi
。它告诉注意何时无法将字符串转换为整数,这与 strtol
不同,后者通过使用 endptr
指定转换是否成功。如果无法执行转换,则返回零。
建议阅读:correct usage of strtol
示例:
char *end;
char *str = "test";
long int result = strtol(str, &end, 10);
if (end == str || *temp != '[=11=]')
printf("Could not convert '%s' to long and leftover string is: '%s'\n", str, end);
else
printf("Converted string is: %ld\n", result);
strtol
系列函数提供了这种能力。它们允许您将字符串转换为数字类型(取决于您选择的家族的 成员),并且与 atoi
家族不同,它们还允许您检测是否扫描未到达终点就失败了。
它通过使用未包含在转换中的第一个字符的地址填充您传递的指针来实现这一点。如果这不是字符串终止符,它必须提前停止。
还有一种特殊情况,即使字符串无效,它也可能指向终止符(具体来说,空字符串的情况""
)。
例如,以下程序显示了一种使用方法:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[]) {
int i;
long val;
char *next;
// Process each argument.
for (i = 1; i < argc; i++) {
// Get value with failure detection.
errno = 0;
val = strtol (argv[i], &next, 10);
// Check for empty string and characters left after conversion.
if (errno == EINVAL) {
printf ("'%s' invalid\n", argv[i]);
} else if (errno == ERANGE) {
printf ("'%s' out of range\n", argv[i]);
} else if (next == argv[i]) {
printf ("'%s' is not valid at first character\n", argv[i]);
} else if (*next != '[=10=]') {
printf ("'%s' is not valid at subsequent character\n", argv[i]);
} else {
printf ("'%s' gives %ld\n", argv[i], val);
}
}
return 0;
}
运行 带有参数 hi "" 42 3.14159 9999999999999999999999999 7 9q
的代码给出:
'hi' is not valid at first character
'' is not valid at first character
'42' gives 42
'3.14159' is not valid at subsequent character
'9999999999999999999999999' out of range
'7' gives 7
'9q' is not valid at subsequent character
"Is it possible to convert a string into a number with a similar command, without checking if each character is a number?"
是的,这是可能的。 atoi()
was made for this purpose (see also the strtol
该参考文献中的函数族)。
您可以使用atoi
函数。
int atoi(const char *nptr);
我了解到可以使用 sprintf
:
int main()
{
int n;
char s[32];
printf("n=");
scanf("%d",&n);
sprintf(s,"%d",n); //HERE
puts(s);
return 0;
}
是否可以使用类似的命令将字符串转换为数字,而不检查每个字符是否为数字?
是的。您可以使用 strtol
函数。
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
strtol
将 nptr
指向的字符串的初始部分转换为 long int
表示。
最好不要使用 atoi
。它告诉注意何时无法将字符串转换为整数,这与 strtol
不同,后者通过使用 endptr
指定转换是否成功。如果无法执行转换,则返回零。
建议阅读:correct usage of strtol
示例:
char *end;
char *str = "test";
long int result = strtol(str, &end, 10);
if (end == str || *temp != '[=11=]')
printf("Could not convert '%s' to long and leftover string is: '%s'\n", str, end);
else
printf("Converted string is: %ld\n", result);
strtol
系列函数提供了这种能力。它们允许您将字符串转换为数字类型(取决于您选择的家族的 成员),并且与 atoi
家族不同,它们还允许您检测是否扫描未到达终点就失败了。
它通过使用未包含在转换中的第一个字符的地址填充您传递的指针来实现这一点。如果这不是字符串终止符,它必须提前停止。
还有一种特殊情况,即使字符串无效,它也可能指向终止符(具体来说,空字符串的情况""
)。
例如,以下程序显示了一种使用方法:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[]) {
int i;
long val;
char *next;
// Process each argument.
for (i = 1; i < argc; i++) {
// Get value with failure detection.
errno = 0;
val = strtol (argv[i], &next, 10);
// Check for empty string and characters left after conversion.
if (errno == EINVAL) {
printf ("'%s' invalid\n", argv[i]);
} else if (errno == ERANGE) {
printf ("'%s' out of range\n", argv[i]);
} else if (next == argv[i]) {
printf ("'%s' is not valid at first character\n", argv[i]);
} else if (*next != '[=10=]') {
printf ("'%s' is not valid at subsequent character\n", argv[i]);
} else {
printf ("'%s' gives %ld\n", argv[i], val);
}
}
return 0;
}
运行 带有参数 hi "" 42 3.14159 9999999999999999999999999 7 9q
的代码给出:
'hi' is not valid at first character
'' is not valid at first character
'42' gives 42
'3.14159' is not valid at subsequent character
'9999999999999999999999999' out of range
'7' gives 7
'9q' is not valid at subsequent character
"Is it possible to convert a string into a number with a similar command, without checking if each character is a number?"
是的,这是可能的。 atoi()
was made for this purpose (see also the strtol
该参考文献中的函数族)。
您可以使用atoi
函数。
int atoi(const char *nptr);