#include <stdio.h> #include <iostream> using namespace std; void extractNum(char * str); int main() { char s[1024]; cin.getline(s,1024); // 输入一行字符 extractNum(s); // 调用extractNum函数,选出数字 cout<<s<<endl; // 输出选出的数字 return 0; } // 函数extractNum:选出str指向的字符串中的数字,并写回str // 参数:str-指向字符串 void extractNum(char * str) { // 请在此添加代码,实现函数extractNum /********** Begin *********/ char *p = str; while (*str != '\0') { if (*str == '-' && (p == str || *(p - 1) < '0' || *(p - 1) > '9')) { if (*(str + 1) >= '0' && *(str + 1) <= '9') { *p = *str; p++; } } else if (*str >= '0' && *str <= '9') { *p = *str; p++; } str++; } *p = '\0'; /********** End **********/ }
时间: 2025-05-27 13:29:52 浏览: 19
### C++ 中 `extractNum` 函数实现详解
在 C++ 编程中,提取字符串中的数字是一项常见的需求。通常可以通过遍历字符串并检测字符是否为数字来完成这一任务。以下是基于指针操作的一种可能的 `extractNum` 实现及其详细说明。
#### 基于指针的 `extractNum` 函数实现
以下代码展示了如何利用指针筛选字符串中的数字:
```cpp
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
// 提取字符串中的所有数字到一个整数向量中
void extractNum(const char* str, vector<int>& nums) {
while (*str != '\0') { // 遍历整个字符串直到遇到终止符
if (isdigit(*str)) { // 如果当前字符是数字
int num = 0;
const char* p = str; // 创建临时指针指向当前数字起始位置
while (isdigit(*p)) { // 继续读取连续的数字部分
num = num * 10 + (*p - '0'); // 将字符转换为对应的数值
++p; // 移动指针至下一个字符
}
nums.push_back(num); // 将解析得到的数字存入向量
str = p; // 更新主指针跳过已处理的部分
} else {
++str; // 跳过非数字字符
}
}
}
int main() {
vector<int> numbers;
const char* inputStr = "abc123def456ghi";
extractNum(inputStr, numbers);
cout << "Extracted Numbers: ";
for (const auto& num : numbers) {
cout << num << " ";
}
return 0;
}
```
#### 代码逻辑分析
1. **输入参数**
- 输入是一个以 `\0` 结束的 C 风格字符串 (`const char*`)。
- 输出是一个存储提取出的整数的动态数组 (`std::vector<int>`)[^1]。
2. **核心循环结构**
- 外层 `while` 循环用于逐字符扫描字符串,直至到达字符串末尾(`\0`)。
- 内部嵌套了一个条件分支:当发现某个字符为数字时进入内部循环;否则直接跳过该字符[^2]。
3. **数字解析过程**
- 当找到首个数字字符后,启动另一个局部指针 `p` 来追踪完整的数字序列。
- 利用十进制权值累加法计算多位数字的实际值[^3]。
4. **性能考虑**
- 整体时间复杂度接近 O(n),因为每个字符最多被访问两次(一次在外层循环判断阶段,另一次在内层循环构建数字期间)[^4]。
#### 可能的改进方向
尽管上述实现已经较为高效且易于理解,但仍存在一些潜在优化空间:
- **支持浮点数提取**: 当前版本仅限于整数提取。如果希望同时捕获小数,则需要额外引入状态标志位区分不同情况下的句点用途(作为千分位还是实际的小数点)[^5]。
- **增强鲁棒性**: 对非法输入做更多预检工作,比如确认传入确实是指向有效内存区域的有效指针等。
---
###
阅读全文
相关推荐


















