在本章中,我们将讨论如何将一种类型转换为另一种类型。C语言有多种实现转换的方法,有些方法可能与你在其他语言中习惯的有所不同。
在讨论如何实现转换之前,我们先讲讲当转换真的发生时,它们是如何工作的。
与许多语言不同,C语言在字符串与数字之间(反之亦然)的转换,并不像数值转换那样流畅。
为此,我们需要调用函数来完成这些繁琐的工作。
当我们想将数字转换为字符串时,可以使用 sprintf()(发音为 SPRINT-f)或 snprintf()(发音为 s-n-print-f)。
这两个函数基本上像 printf(),只是它们的输出对象是字符串,之后你可以打印该字符串或做其他处理。
例如,将部分数值 π 转换为字符串:
#include <stdio.h>
int main(void)
{
char s[10];
float f = 3.14159;
// 将“f”转换为字符串,存储在“s”中,最多写入10个字符,包括空字符结尾符
snprintf(s, 10, "%f", f);
printf("String value: %s\\n", s); // 输出字符串值: 3.141590
}
所以你可以像处理整数那样使用 %d 或 %u。
在C语言中,有两类函数族可以完成字符串到数字的转换。我们称它们为 atoi(发音为 a-to-i)家族和 strtol(stir-to-long)家族。
对于从字符串到数字的基本转换,可以尝试使用来自 <stdlib.h> 的 atoi 函数。这些函数的错误处理能力较差(如果传入不合适的字符串,可能会导致未定义行为),所以要谨慎使用。
| 函数 | 描述 |
|---|---|
| atoi | 字符串转为 int |
| atof | 字符串转为 float |
| atol | 字符串转为 long int |
| atoll | 字符串转为 long long int |
虽然规范并未明确指出,但函数名开头的 a 实际上代表 ASCII,所以 atoi() 的含义是“ASCII 转整数”,不过今天这样说显得有些过于以 ASCII 为中心。
这是一个将字符串转换为浮点数(float)的示例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *pi = "3.14159";
float f;
f = atof(pi);
printf("%f\\n", f);
}
但是,正如我之前所说,遇到类似下面这样的奇怪情况会导致未定义行为:
int x = atoi("what"); // “what” 不是我听说过的数字