From 3a8856c3ea4f53d1580542013cc4da91f28073f7 Mon Sep 17 00:00:00 2001 From: murmur Date: Mon, 21 Oct 2024 15:12:08 +0800 Subject: [PATCH] =?UTF-8?q?CSSC-PC=E6=9B=B4=E6=96=B0=E4=BA=861=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 代码/字符串.md | 104 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 代码/字符串.md diff --git a/代码/字符串.md b/代码/字符串.md new file mode 100644 index 0000000..e25f979 --- /dev/null +++ b/代码/字符串.md @@ -0,0 +1,104 @@ +--- +tags: + - 代码块 + - 源码 + - 字符串 + - 转换 +--- +# 字符串转浮点 +在C语言中,可以使用标准库函数 `atof()` 或者 `strtof()` 将ASCII字符串转换为浮点数。如果输入的字符串是形如 `-12.354` 的格式,可以直接通过这些函数进行转换。下面是两种方式的示例: + +### 方法一:使用 `atof()` +```c +#include +#include // 包含 atof() + +int main() { + char str[] = "-12.354"; + float num; + + // 使用 atof() 函数将字符串转换为浮点数 + num = atof(str); + + printf("字符串 \"%s\" 转换为浮点数: %f\n", str, num); + + return 0; +} +``` +### 方法二:使用 `strtof()` +`strtof()` 更推荐,因为它允许你处理错误情况,并提供了更好的控制。 + +```c +#include +#include // 包含 strtof() + +int main() { + char str[] = "-12.354"; + char *end; + float num; + + // 使用 strtof() 函数将字符串转换为浮点数 + num = strtof(str, &end); + + // 判断转换是否成功 + if (*end == '\0') { + printf("字符串 \"%s\" 成功转换为浮点数: %f\n", str, num); + } else { + printf("转换失败,剩余未转换的字符: %s\n", end); + } + + return 0; +} +``` + +### 解释: +1. `atof()` 是一个简单的字符串到浮点数的转换函数,但是它没有错误检查机制。它直接将字符串转换为 `float`,如果字符串格式不正确,它的行为是未定义的。 +2. `strtof()` 提供了更灵活的错误处理方式,它会返回一个指针,指向输入字符串中第一个未处理的字符。通过检查这个指针,可以判断是否成功转换了整个字符串。 +## 非法字符剔除 +要将形如 `"$P=-00.454 ;"` 的字符串中的数值提取并转换为浮点数,首先需要对字符串进行解析,提取出数值部分,然后再使用 `atof()` 或 `strtof()` 进行转换。 + +可以按照以下步骤操作: +1. **忽略不需要的字符**(如 `$P=` 和 `;`),只提取数值部分 `-00.454`。 +2. **将数值字符串转换为浮点数**。 + +### 示例代码: +```c +#include +#include +#include + +int main() { + char str[] = "$P=-00.454 ;"; + char *start, *end; + float num; + + // 查找等号后的字符位置 + start = strchr(str, '='); // 找到 '=' 的位置 + if (start != NULL) { + start++; // 跳过 '=' + + // 使用 strtof() 函数从字符串中提取浮点数 + num = strtof(start, &end); + printf("提取的数值: %f\n", num);//忽略异常 + + // 检查转换是否成功,并且确保后面是分号 ';' + if (*end == ' ') { + printf("提取的数值: %f\n", num); + } else { + printf("转换失败,剩余未转换的字符: %s\n", end); + } + } else { + printf("没有找到等号。\n"); + } + + return 0; +} +``` + +### 代码解释: +1. 使用 `strchr()` 查找等号 `'='` 的位置,提取等号后面的字符串。 +2. 使用 `strtof()` 函数将等号后的数值部分(如 `-00.454`)转换为浮点数。 +3. 检查 `strtof()` 返回的指针,确保后面的字符是 `';'`,表明数值部分成功提取并转换。 + +### 忽略异常 +除非首字符非法,不然能够正常转换,故可忽略末尾的错误检查。 \ No newline at end of file