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

相关推荐
fadtes35 分钟前
C++ extern(八股总结)
开发语言·c++·算法
Trouvaille ~1 小时前
CSDN 博客:CC++ 内存管理详解
java·c语言·c++
xiaoshiguang31 小时前
LeetCode:236. 二叉树的最近公共祖先
java·算法·leetcode
WeeJot嵌入式1 小时前
C语言----指针
c语言·指针
Smark.1 小时前
(leetcode算法题)面试题 17.19. 消失的两个数字
算法·leetcode
Octopus20771 小时前
链地址法(哈希桶)
c++·笔记·学习·算法·哈希算法
Cedric_Anik1 小时前
数据结构——二叉树
数据结构·算法
KeyPan2 小时前
【数据结构与算法:八、排序】
开发语言·数据结构·人工智能·后端·算法·排序算法·scala
看星猩的柴狗2 小时前
密码学原理技术-第十一章-Hash Functions
算法·密码学·哈希算法