在 C 语言中,如果想要将一个字符串转换为一个数字,常用的有以下 3 种方式。
- 使用 sscanf() 函数。
- 使用 atoi() 函数。
- 使用 strtol()、strtoll() 等函数。
使用 sscanf() 函数
在 C 语言中,我们可以使用 sscanf() 函数来将一个字符串转换为一个数字。
语法:
sscanf(str, format, &num)说明:
sscanf() 函数接收以下 3 种参数。
str(char *):是一个字符串。format(const char *):是预定义好的格式,用于指定要读取的数据类型。比如 “%d” 表示读取整数。&num:是一个指针,表示获取该数字的地址。
示例 1:sscanf() 将字符串转为整数
#include <stdio.h>
int main(void)
{
char str[] = "666";
int num;
int result = sscanf(str, "%d", &num);
if (result == 1)
{
printf("%d\n", num);
}
else
{
printf("转换失败\n");
}
return 0;
}运行结果如下。
666使用 atoi() 函数
在 C 语言中,我们还可以使用 atoi() 函数来将一个字符串转换为一个整数。其中,atoi 是 “ascii to int” 的缩写。
注意: atoi() 虽然是标准 C 函数,但由于它无法区分 “转换失败” 和 “数字 0”,并且无法检测溢出,因此在现代开发中不推荐使用,而是建议用 strtol() 替代。
语法:
atoi(str)说明:
atoi() 函数接收单个参数。
str(char *):是一个字符串。
示例 2:atoi() 将字符串转为整数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[] = "666";
int num = atoi(str);
printf("%d", num);
return 0;
}运行结果如下。
666使用 strtol()、strtoll() 等函数(更安全)
在 C 语言中,我们还可以使用 strtol()、strtoll()、strtoul()、strtoull() 等函数来安全地将字符串转换为数字。这些函数更加强大且安全,并且提供了错误检查和处理不同进制数的功能。
| 函数 | 说明 |
|---|---|
| strtol() | 将字符串转换为 long int 整数,支持指定进制并进行错误检查。 |
| strtoll() | 将字符串转换为 long long int 整数,支持指定进制并进行错误检查。 |
| strtoul() | 将字符串转换为 unsigned long int 无符号整数,支持指定进制并进行错误检查。 |
| strtoull() | 将字符串转换为 unsigned long long int 无符号整数,支持指定进制并进行错误检查。 |
提示: strtol() 是 “string to long” 的缩写。
语法:
strtol(str, endptr, base)说明:
strtol() 函数接收以下 3 个参数。
str(char *):是一个字符串。endptr(char **):是一个指向字符指针的指针。如果转换成功,则 *endptr 会指向字符串中未被转换部分的第一个字符。如果转换失败(比如字符串以非数字字符开头),则 *endptr 将指向 nptr 的开头。我们可以利用这一点来进行错误检查。base:表示数字的进制。如果 base 为 0,则会根据 “字符串的前缀” 来判断进制(例如 “0x” 或 “0X” 表示十六进制, “0” 表示八进制等)。如果 base 在 2 到 36 之间,则表示按指定进制进行转换。
示例 3:strtol() 将字符串转为整数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[] = "666lvyenet";
char *endptr;
long int num = strtol(str, &endptr, 10);
if (*endptr == '\0')
{
printf("转换成功!数字为:%ld\n", num);
}
else if (endptr == str)
{
printf("转换失败:字符串不是以数字开头\n");
}
else
{
printf("转换部分成功!数字为:%ld,剩余为:%s\n", num, endptr);
}
return 0;
}运行结果如下。
转换部分成功!数字为:666,剩余为:lvyenet