xdoj-字符串-556,为什么字符不能被正常读入

目录

题目

代码

测试用例

[the input](#the input)

[the correct output](#the correct output)

问题发现过程阐述

如果把line16中的数组大小11换成line17中的10

[case 1](#case 1)

[case 2](#case 2)

[case 3](#case 3)

如果数组开成11

case4

代码分析

问题描述

Question1

Question2


题目

题目:连续数字字符串提取

问题描述

输入一个字符串,将连续的数字字符串放到另一个二维数组中

输入格式

输入一个含连续数字的待提取字符串。

输出格式

输出提取出来的数字字符串,每个连续数字字符串占一行。

样例输入

1234abc7654321[][]79869hewl98765

样例输出

1234

7654321

98765

样例说明

79869不连续,不输出。

评测用例规模与约定

提取出来的连续数字字符串长度不超过20,输入字符串内至多含有10个连续字符串,

时间限制1s,内存限制256KB。(注:1287视为整体,不属于连续数字字符串,不可被看

为是12与87两个连续数字字符串。单独的数字如1,视为连续字符串,需要加以输出)

代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

short continuity_judge(char * s,short n);
int main()
{
    char s[211] = "";
    gets(s);

    typedef struct
    {
        char nums[21];
        short total;
    }STRINGS;
    STRINGS strings[11];
    //STRINGS strings[10];
    short index = 0,i = 0;

    //extraction
    for(char *p = s;*p;p++)
    {
        while(*p && isdigit(*p))
        {
            strings[index].nums[i++] = *p++;
        }
        if(i){
            strings[index].total = i;
            strings[index].nums[i] = '\0';
            i = 0;
            index++;
        }
    }

    //judge and output
    for(i = 0;i < index;i++)
    {
        if(continuity_judge(strings[i].nums,strings[i].total)){
            puts(strings[i].nums);
        }
    }
    return 0;
}
short continuity_judge(char * s,short n)
{
    if(n == 1)
        return 1;
    short deta = s[1] - s[0];
    if(deta != 1 && deta != -1 )
        return 0;
    for(int i = 1;i < n-1;i++)
    {
        if(s[i+1] - s[i] != deta)
            return 0;
    }
    return 1;
}

测试用例

the input

42193@2__123nxoq81x01u3&123xq0981d80192j81028!@93121238ydiqw123jdw1cu012

the correct output

2

123

01

3

123

123

1

012

问题发现过程阐述

问题在line16,line17

如果把line16中的数组大小11换成line17中的10

case 1

输入

42193@2__123nxoq81x01u3&123xq0981d80192j81028!@93121238ydiqw123jdw1cu012

输出就变成了

2

123

01

3

123

123

1

0

最后一项少了12

并且通过调试,这一项在strings数组最后一项的nums字符串里确实被存成了0,证明12未被读入

case 2

如果输入少进一个字符

2193@2__123nxoq81x01u3&123xq0981d80192j81028!@93121238ydiqw123jdw1cu012

输出就

2

123

01

3

123

123

1

01

多读进来一个

case 3

再少输入进一个字符

193@2__123nxoq81x01u3&123xq0981d80192j81028!@93121238ydiqw123jdw1cu012

输出

2

123

01

3

123

123

1

012

正常了

如果数组开成11

case4

输入

42193@2__123nxoq81x01u3&123xq0981d80192j81028!@93121238ydiqw123jdw1cu012

输出

2

123

01

3

123

123

1

012

正常了

代码分析

仔细解读代码后发现其实strings[]数组开得有问题,这个输入中有14个数字串,数组开得不够大

问题描述

Question1

为什么数组开到11就正常了,明明有14个数字串,按理来说即使改成11,后面三个应该无法读入才对

Question2

为什么在数组开到10时会出现这种最后几个字符没被读入,改变输入序列长度就能读进去的情况,

这看着反倒像是s[]数组开得不够大,但实际是s[]开得足够大了

相关推荐
mochensage1 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
chengooooooo1 小时前
leetcode Top100 238. 除自身以外数组的乘积|数组系列
算法·leetcode
GUIQU.1 小时前
【每日一题 | 2025年6.2 ~ 6.8】第16届蓝桥杯部分偏简单题
算法·蓝桥杯·每日一题
weixin_527550402 小时前
初级程序员入门指南
javascript·python·算法
乄夜2 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
思捻如枫4 小时前
C++数据结构和算法代码模板总结——算法部分
数据结构·c++
嘉陵妹妹4 小时前
深度优先算法学习
学习·算法·深度优先
GalaxyPokemon4 小时前
LeetCode - 53. 最大子数组和
算法·leetcode·职场和发展
小猫咪怎么会有坏心思呢4 小时前
华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)
数据结构·链表·华为od
乖乖是干饭王5 小时前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu