c语言数组中提取数字
1. 前言
在编程世界中,数组是一种常见的数据结构,常常用于存储同类型的数据,其使用方式简单且高效。在实际生活中,我们也常常遇到需要从一堆混杂的数据中提取某些数字的情况,比如从一段文字中提取手机号码或身份证号码等。本文将介绍一种简单的方法来提取一个数组中的数字。
2. 定义问题
假设我们有一个包含多种不同类型的元素的数组,例如:
```
void *arr[] = {"Hello", 123, 4.56, "World", '!', 789};
```
我们想要从这个数组中提取所有的数字,即 `123`,`4.56`,和`789`。我们需要一个函数来完成这个任务。
3. 解决问题
我们可以自定义一个函数,名为 `extract_num`,其输入参数是一个指向 void 类型的指针数组和数组的长度,输出则是一个整型数组,包含了该数组中所有的数字。
首先,我们需要定义一个辅助函数,名为 `is_digit`,其输入参数是一个字符,输出为真(true)当且仅当该字符是一个数字(即
`'0'` 到 `'9'` 之间的字符)。
```
int is_digit(char ch) {
return ch >= '0' && ch <= '9';
}
```
接着,我们依次遍历输入的数组,并将其中的数字提取出来存储到一个新的数组中。我们需要定义一个
变量,名为 `i`,用于记录新数组的当前位置。初始值为0。在遍历数组时,对于每一个元素,我们都先检查其类型是否是数字(即进行类型转换后,是否与原来的值相等),如果不是数字,则跳过该元素;如果是数字,则解析出其中的数字部分,并将其存储到新数组中。在解析数字部分时,我们需要逐个遍历该元素的所有字符,出其中的数字部分,并转换成整型存到新数组中。示例代码如下:
```
int *extract_num(void **arr, int len) {
int *nums = (int *)malloc(len * sizeof(int));
int i = 0;
for (int j = 0; j < len; j++) {
if (strcmp("int", typeid(*(int
*)arr[j]).name()) != 0 &&
strcmp("float", typeid(*(float *)arr[j]).name()) != 0) {
continue;
}
int num = 0;
char *str = (char *)arr[j];
int k = 0;
while (str[k]) {
if (is_digit(str[k])) {
strcmp比较数组num = num * 10 + str[k] - '0';
}
k++;
}
nums[i++] = num;
}
return nums;
}
```
我们使用 `strcmp` 函数来判断一个元素的类型是否为数字。由于 C 语言本身并没有直接提供判断变量类型的函数,我们需要借助于`typeinfo` 头文件中的 `typeid` 函数来获取其类型,并使用
`strcmp` 函数比较类型名。
4. 总结
在本文中,我们介绍了一种简单的解决方案,将一个包含各种类型元素的数组中的数字提取出来存储到一个新的数组中。这种方法涉及到了指针、类型转换、字符操作等多种 C 语言中的基础概念。通过本文的介绍,相信读者们能够更好地理解这些概念,并能够在实际编程中灵活应用。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。