obsidian-notes/代码/字符串.md
2024-10-21 15:12:08 +08:00

104 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tags:
- 代码块
- 源码
- 字符串
- 转换
---
# 字符串转浮点
在C语言中可以使用标准库函数 `atof()` 或者 `strtof()` 将ASCII字符串转换为浮点数。如果输入的字符串是形如 `-12.354` 的格式,可以直接通过这些函数进行转换。下面是两种方式的示例:
### 方法一:使用 `atof()`
```c
#include <stdio.h>
#include <stdlib.h> // 包含 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 <stdio.h>
#include <stdlib.h> // 包含 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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()` 返回的指针,确保后面的字符是 `';'`,表明数值部分成功提取并转换。
### 忽略异常
除非首字符非法,不然能够正常转换,故可忽略末尾的错误检查。