《选出串中数字》
任务描述
本关任务
在一串隐藏着一个或多个数值的字符中,选出字符串中的所有数字字符,并将选出的数字字符重新组成新字符串。如果在第一个数字字符之前有负号,则保留该负号,有多个负号时只保留一个。
例如:输入的字符串为“a-1-2-4sd5 s6”,抽取数字后得到的新字符串为“-12456”。
预期输出
测试输入:1 s23df53dcas12sd-121sd
预期输出:1235312121
输入:1 s23df53dcas12sd-121sd
输出:1235312121
测试输入:a-1-2-3sd45 j67sd
预期输出:-1234567
输出:a-1-2-3sd45 j67sd
输入:-1234567
基础代码
#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 *********/
/********** End **********/
}
基本思路
题目分析
本关描述较为简单,但相对实现起来需要较为灵活的思路和对指针的理解。
第一部分:数字的获取。
此部分用指针迭代判断即可。
在非字符截止符的情况下,用ASCII 码判断。
代码如下:
char *p=str,*q =str; //养成好习惯,不直接动原始输入指针
else if (*q >= '0' && *q <= '9')//在ASCII码中,0~9是连续的。
{
*p = *q;
p++;
q++;
}
对于
*p = *q;
p++;
q++;
可简写成
*p++=*q++;
具体运算可搜索: 指针运算优先级
第二部分:取负号。
此部分麻烦的在于,负号可能出现在各个位置,但是负号在输出中只能出现在首位。
可以利用一个非常巧妙的方法来规范负号。
我们先声明一个int型的变量a并赋值其为1,
此变量将是判断分支的重要组成。
直接上代码
int a =1;
while (*q != '\0')
{
if (*q == '-' && a)
{
a = 0;
*p = *q;
p++;
q++;
}
}
此为一个循环,我们只需要一个负号,则在第一次出现负号后,其余都需舍弃,于是利用一个判断变量进行判断。当while循环中出现了负号,a的值成为0,再与前的是否相等进行一个与运算,得结果0或1,以判断是否再需要进行此分支。
然而负号不能出现在数字中间,我们同样利用相同的方式进行处理。
在数字获取部分:
else if (*q >= '0' && *q <= '9')
{
a = 0;//加上此句
*p = *q;
p++;
q++;
}
即可。
最后,进行循环
在分支外循环内添加
else
{
q++;
}
最终,在输入指针的结尾处添加截止符,防止出现乱码。
*p = '\0';
代码展示
#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, * q = str;
int a = 1;
while (*q != '\0')
{
if (*q == '-' && a)
{
a = 0;
*p = *q;
p++;
q++;
}
else if (*q >= '0' && *q <= '9')
{
a = 0;
*p = *q;
p++;
q++;
}
else
{
q++;
}
}
*p = '\0';
/********** End **********/
}