头歌实训 C/C++指针基础 《选出串中的数字》解析

《选出串中数字》

任务描述

本关任务

在一串隐藏着一个或多个数值的字符中,选出字符串中的所有数字字符,并将选出的数字字符重新组成新字符串。如果在第一个数字字符之前有负号,则保留该负号,有多个负号时只保留一个。

例如:输入的字符串为“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 **********/
}
  • 14
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值