.串的内容提取 设计一个C语言算法实现串的整理,提取其中的整数、浮点数(由逗号隔开),如“ 12.34 ,9,apple,0.56,!#,123",整理出12.34,9,0.56,123
时间: 2024-10-14 08:11:07 浏览: 30
为了实现这个功能,你可以使用C语言中的循环和条件判断来分割字符串,并将整数和浮点数存入适当的容器,例如数组或链表。这里我们简单地使用字符串处理函数来演示,但实际应用中可能需要更复杂的数据结构如动态数组。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <float.h> // 包含FLT_EPSILON,用于比较浮点数精度
// 辅助函数,用于检测下一个可能是数字的字符
int is_number(char c) {
return (isdigit(c) || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}
// 将字符串中的数字提取并转换成浮点数
double extract_float(char* str, double* result, char** endptr) {
*result = 0.0;
char* start = str;
while (is_number(*start) || (*start == '.' && *(start + 1) != '\0')) {
start++;
}
if (*start == '.') { // 检查是否只有小数点
if (*(start + 1) == '\0') return *result; // 如果只有一位小数点,视为无效
start++; // 移动指针到第一个有效数字
}
while (is_number(*start)) {
*result *= 10;
*result += *start - '0';
start++;
}
if (*start == '.') { // 检查是否有额外的小数点
char* decimal = start;
while (is_number(*(decimal + 1))) {
decimal++;
}
*endptr = decimal + 1;
if (fabs(*result * pow(10, (int)(decimal - start))) < FLT_EPSILON) {
// 如果小数位过多导致精度损失,忽略它
*endptr = str;
} else {
*result += (double)(*(decimal - 1)) / pow(10, (int)(decimal - start));
}
}
return *result;
}
// 主函数,提取字符串中的所有数值
void extract_numbers(char* str, char delimiter, double* numbers[], int* count) {
*count = 0;
char* current = str;
while (current != '\0') {
char* endptr;
double num = extract_float(current, &numbers[*count], &endptr);
if (num != 0 && endptr != current) { // 忽略非数字部分和空白
numbers[*count] = num;
current = endptr;
} else {
current = strchr(current, delimiter); // 找到下一个分隔符
if (current != NULL) {
current++; // 跳过分隔符
}
}
(*count)++;
}
}
int main() {
char str[] = " 12.34 ,9,apple,0.56,!#,123";
double numbers[10]; // 假设最多有10个数字
int count = 0;
extract_numbers(str, ',', numbers, &count);
for (int i = 0; i < count; i++) {
printf("%.2f ", numbers[i]); // 打印每个数字保留两位小数
}
printf("\n");
return 0;
}
```
注意,这个示例假定输入字符串中不会有连续的逗号或其他特殊字符作为数值的一部分。实际应用中,你可能需要根据实际情况调整或添加错误处理。
阅读全文