引自免费微信小程序:皆我百晓生
为了完成这个任务,我们需要遍历整个字符串,检查每个字符是否为数字或负号,并且确保在数字序列前只有一个负号被保留。以下是完整的C语言代码实现:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_LEN 80
void extractNum(char * str);
int main() {
char str[MAX_LEN];
fgets(str, MAX_LEN, stdin); // 使用fgets替代gets以避免安全问题
extractNum(str);
puts(str);
return 0;
}
// 函数extractNum:选出str指向的字符串中的数字,并写回str
// 参数:str-指向字符串
void extractNum(char * str) {
int len = strlen(str);
int writePos = 0; // 写入位置
int hasNegative = 0; // 是否已经遇到负号
for (int readPos = 0; readPos < len; readPos++) {
if (isdigit(str[readPos]) || (!hasNegative && str[readPos] == '-')) {
if (str[readPos] == '-') {
hasNegative = 1;
}
str[writePos++] = str[readPos];
}
}
str[writePos] = '\0'; // 确保字符串以空字符结束
}
在这个代码中,extractNum
函数接收一个字符数组str
作为参数。它首先获取字符串的长度,然后定义两个指针:readPos
用于读取字符串中的字符,writePos
用于在原字符串中写入数字和负号。hasNegative
变量用于跟踪是否已经遇到过负号。
遍历过程中,如果遇到数字或(尚未遇到负号并且当前字符是负号),则将该字符复制到writePos
位置,并将writePos
递增。当遇到负号时,设置hasNegative
为1,以确保后续数字前不再加入额外的负号。
最后,通过在writePos
位置添加一个空字符来终止新构建的字符串,确保其仍然是一个有效的C字符串。这样,extractNum
函数就完成了从原始字符串中提取数字和可能的一个负号的任务。