我了解到可以使用sprintf
将数字转换为字符串:
int main()
{
int n;
char s[32];
printf("n=");
scanf("%d",&n);
sprintf(s,"%d",n); //HERE
puts(s);
return 0;
}
是否可以将字符串转换为具有类似命令的数字,而无需检查每个字符是否为数字?
答案 0 :(得分:3)
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 != '\0') {
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
答案 1 :(得分:2)
是。您可以使用strtol
功能。
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
strtol
将nptr
指向的字符串的初始部分转换为long int
表示。
最好不要使用atoi
。它告诉我们何时无法将字符串转换为整数,而不像strtol
那样使用endptr
指定转换是否成功。如果无法执行转换,则返回零。
示例:
char *end;
char *str = "test";
long int result = strtol(str, &end, 10);
if (end == str || *temp != '\0')
printf("Could not convert '%s' to long and leftover string is: '%s'\n", str, end);
else
printf("Converted string is: %ld\n", result);
答案 2 :(得分:2)
答案 3 :(得分:2)
您可以使用atoi
功能。
int atoi(const char *nptr);