20190729 - coding - 01

本文探讨了一个编程挑战,即从给定字符串中找出并返回最长的连续数字串及其长度。通过几个错误示例代码,分析了常见陷阱,如缓冲区清理不当和指针使用错误,强调了正确处理这些问题的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:最长数字字符串

给定一个字符串,输出字符串中最长的数字串,并把这个数字串的长度输出。

请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串;

注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”,如果没有数字,则返回空字符串(“”)而不是NULL!

输入描述: 
一个字符串 
输出描述: 
输出最长的数字串,输出最长数字串个数; 
中间以逗号(,)隔开;

示例1 
输入 
abcd12345ed125ss123058789 
输出 
123058789,9

思路

字符串是给定的,先用最粗暴的暴力匹配吧;

难点是前后数字串的比较;

看起来挺简单的,实现起来还是很难抓住点

代码

(错误示范)

#include "stdio.h"
#include "string.h"
void find_longest_num_str(char *s)
{
    char *p,*num_str,*temp;
    int len,i,count = 0,num_flag = 0,max_count=0;

    p = s;
    len = strlen(s);
    printf("strlen : %d\n",len);

    for(i=0;i<len;i++)
    {
        //遍历字符串,遇到数字开启内层循环,直到数字结束,保留长度与首地址
        if((*(p+i) >= '0')&&(*(p+i)<='9'))
        {
            printf("find number\n");
            num_flag = 1;

            while(num_flag)
            {
                if((*(p+i) >= '0')&&(*(p+i)<='9'))
                {
                    printf("find number1\n");
                    count++;
                    i++;

                }else
                {
                    if(count >= max_count)
                    {
                        max_count = count;
                        num_str = p+i-count;
                        *(num_str+count+1) = '\0'; //这样做会导致字符串的改变,要小心使用指针

                    }
                    count = 0;
                    num_flag = 0;
                }
            }

        }
    }
    printf("the longest num_str is %s, count %d\n",num_str,max_count);

}


int main()
{
    char *str;
    str = "abc123eb3456322cdd2";
    find_longest_num_str(str);
    return 0;
}

(错误示范2)

#include "stdio.h"
#include "string.h"
void find_longest_num_str(char *p)
{
    char *num_str,temp[50];
    int len,i,j=0,count = 0,num_flag = 0,max_count=0;

    len = strlen(p);
    printf("strlen : %d\n",len);

    for(i=0;i<len;i++)
    {
        //遍历字符串,遇到数字开启内层循环,直到数字结束,保留长度与首地址
        if((*(p+i) >= '0')&&(*(p+i)<='9'))
        {
            num_flag = 1;

            while(num_flag)
            {
                if((*(p+i) >= '0')&&(*(p+i)<='9'))
                {
                    temp[j]=*(p+i);
                    count++;
                    i++;
                    j++;

                }else
                {
                    if(count >= max_count)
                    {
                        max_count = count;
                        num_str = temp;

                    }
                    count = 0;
                    num_flag = 0;
                }
            }

        }
    }
    printf("the longest num_str is %s, count %d\n",num_str,max_count);

}


int main()
{
    char *str;
    str = "abc123eb3456322cdd2";
    find_longest_num_str(str);
    return 0;
}

上面的问题是,没有清空缓存,打印了所有的数字字符

错误代码3

#include "stdio.h"
#include "string.h"
void find_longest_num_str(char *p)
{
    char *num_str,temp[50];
    int len,i,j=0,count = 0,num_flag = 0,max_count=0;

    len = strlen(p);
    printf("strlen : %d\n",len);

    for(i=0;i<len;i++)
    {
        //遍历字符串,遇到数字开启内层循环,直到数字结束,保留长度与首地址
        if((*(p+i) >= '0')&&(*(p+i)<='9'))
        {
            num_flag = 1;

            while(num_flag)
            {

                if((*(p+i) >= '0')&&(*(p+i)<='9'))
                {
                    temp[j]=*(p+i);
                    count++;
                    i++;
                    j++;

                }else
                {
                    if(count >= max_count)
                    {
                        max_count = count;
                        num_str = temp;
                        j=0;

                    }
                    count = 0;
                    num_flag = 0;
                }
            }

        }
    }
    printf("the longest num_str is %s, count %d\n",num_str,max_count);

}


int main()
{
    char *str;
    str = "abc123eb34563227777cdd288888888888888888888";
    find_longest_num_str(str);
    return 0;
}

感觉像缓冲区没有清干净

总结

指针的使用要小心

内层循环和更新条件要小心

编程能力还是太弱了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值