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[]开得足够大了

相关推荐
合方圆~小文9 分钟前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
无限进步_23 分钟前
C语言数组元素删除算法详解:从基础实现到性能优化
c语言·开发语言·windows·git·算法·github·visual studio
松涛和鸣30 分钟前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
Booksort31 分钟前
【LeetCode】算法技巧专题(持续更新)
算法·leetcode·职场和发展
OJAC11133 分钟前
2026高校毕业生1270万!但这些学生却被名企用高薪“提前预定”!
算法
Controller-Inversion35 分钟前
岛屿问题(dfs典型问题求解)
java·算法·深度优先
小白程序员成长日记36 分钟前
力扣每日一题 2025.11.28
算法·leetcode·职场和发展
Swift社区40 分钟前
LeetCode 435 - 无重叠区间
算法·leetcode·职场和发展
sin_hielo40 分钟前
leetcode 1018
算法·leetcode
大工mike1 小时前
代码随想录算法训练营第三十一天 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
算法