首页 > 试题广场 >

In the main() function, after

[单选题]
In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?
int FindSubString(char* pch){
    int   count  = 0;
    char  * p1   = pch;
    while (*p1 != '\0'){    
        if (*p1 == p1[1] - 1){
            p1++;
            count++;
        }else  {
            break;
        }
    }
    int count2 = count;
    while (*p1 != '\0'){
        if (*p1 == p1[1] + 1){
            p1++;
            count2--;
        }else  {
            break;
        }
    }
    if (count2 == 0)
        return(count);
    return(0);
}
void ModifyString(char* pText){
    char  * p1   = pText;
    char  * p2   = p1;
    while (*p1 != '\0'){
        int count = FindSubString(p1);
        if (count > 0){
            *p2++ = *p1;
            sprintf( p2, "%i", count );
            while (*p2 != '\0')  {
                p2++;
            }
            p1 += count + count + 1;
        }else  {
            *p2++ = *p1++;
        }
    }
}
void main(void){
    char text[32] = "XYBCDCBABABA";
    ModifyString(text);
    printf("%s\n", text);
}  
  • XYBCDCBABABA
  • XYBCBCDA1BAA
  • XYBCDCBA1BAA
  • XYBCDDBA1BAB
推荐

FindSubString() 函数就是要找到一个先递增再递减且递增和递减的数量相等的回文序列,例如: ABCDCBA ,先是   后一项 = 前一项 ASCII +1 后是   后一项 = 前一项 ASCII -1 ,才能返回回文子串的长度,否则返回 0

ModifyString() 函数不断寻找上述类型的子串,如果不满足条件,就

*p2++ = *p1++;

当遇到 ABABA 中前一个 ABA 的时候,满足回文子串要求,此时 p1 指向 A BABA p2 指向 ABABA sprintf 重定向修改 ABABA B 变为 1 ,且跟随一个 ‘\0’ (该函数自动产生的) , 此时,字符串变为 A1‘\0’BA

经过    while ( *p2 != '\0' ) 循环之后, p2 指向 A1‘\0’BA p1 += count + count + 1 之后, p1 指向 A1‘\0’BA 。此时字符串已经被改动,之前的 ABABA 已经不存在,变为 A1‘\0’BA

再次进入 while ( *p1 != '\0' ) 循环之后,只能执行 else 部分的命令, p1 指向 p2 指向的元素的后一个,不断将 p1 指向的元素传给 p2 所指向的位置,将原数据覆盖。所以, A1‘\0’BA ,依次变为 A1BBA A1BAA 。即最终结果为 XYBCDCBA1BAA

编辑于 2016-02-23 15:14:05 回复(15)
#include "stdafx.h"
#include <time.h>
#include <cstdio>
#include <iostream>
#include <stdlib.h>
using namespace std;
int FindSubString( char* pch )
{
    int   count  = 0;
    char  * p1   = pch;
    while ( *p1 != '\0' )
    {   
        if ( *p1 == p1[1] - 1 )
        {
            p1++;
            count++;
        }else  {
            break;
        }
    }
    int count2 = count;
    while ( *p1 != '\0' )
    {
        if ( *p1 == char(p1[1] + 1) )
        {
            p1++;
            count2--;
        }else  {
            break;
        }
    }
    if ( count2 == 0 )
        return(count);
    return(0);
}

void ModifyString( char* pText )
{
    char  * p1   = pText;
    char  * p2   = p1;
    while ( *p1 != '\0' )
    {
        int count = FindSubString( p1 );
        if ( count > 0 )
        {
            *p2++ = *p1;
   *p2=count+48;
            while ( *p2 != '\0' )
            {
                p2++;
            }
            p1 += count + count + 1;
        }else  {
            *p2++;
   *p1++;
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])

 char text[32] = "XYBCDCBABABA";
 ModifyString( text );
    printf( text );
 system("pause");
 return 0;
}
发表于 2018-03-26 17:56:51 回复(0)
第一個坑:回文返回(bcdcba返回-1),第一次返回count(1) > 0的时候是(abab)
第二个坑:sprintf(添加'\0') 与 p1 += count + count + 1;(p1多跳,p2少跳,导致数据错乱(末尾的A))
发表于 2021-02-24 23:17:51 回复(0)
BCDCBA这段因为count1与count2不等,所以跳过
发表于 2016-08-18 15:11:42 回复(0)
***,有点东西,学习一哈
发表于 2019-03-01 15:55:59 回复(0)
为什么会跳过CDC?

这要从仔细读源码开始了。
FindSubString的功能,上面已经解释很清楚了,寻找一个先连续递增,在连续递减的字符串,终止条件是递减结束。但是他很严格的要求,递增的长度和递减的长度是相等的。看看CDC前后是什么:XYBCDCBABABA。XY明显不满足,所以跳过了。BCD满足递增,DCBA满足递减,但是二者长度不相等,所以也要跳过。到了CD递增,DCBA递减,同样跳过。

是不是也能想清楚为什么是ABA了?


发表于 2016-06-08 10:58:38 回复(6)
FindSubString函数查找对称的回文子串(例如CDC),返回count,若不是回文子串或者不对称则返回0
字符串XYBCDCBABABA 之前的所有字符执行的都是 ModifyString函数中的else子段,即*p2++=*p1++;
字符串 XYBCDCBABABA 第一个对称回文子串为ABA,此时sprintf语句会用count(此时为1)替换B,并自动添加串结尾符'\0'在第二个A的位置,
则下边的while语句即将p2指针移动到第二个A的位置,p1 += count + count +1将p1移动到第二个A后面的B位置上,即p2的后一位
这之后没有对称回文子串,则执行*p2++=*p1++,直到p1到达串尾,即用倒数第二个字符替换倒数第三个,用倒数第一个字符替换倒数第二个
综上,结果是XYBCDCB A1 BA A
发表于 2015-08-06 14:55:18 回复(6)
FindSubString()中
用到了“回文段落跳过” 
*p1 == p1[1] - 1,即看该字符串是不是递增的,即x后面是y,y后面是z,然后用count记录
*p1 == p1[1] + 1,即看该字符串是不是递减的,即z后面是y,y后面是x,然后用count2递减
若回文则返回 回文子串长度,若不回文则返回0

ModifyString()中
过滤XY,找到第一个回文字段的开始,即BCDCB 中的B,然后跨过回文段
到ABABA,进入FindSubString() 得 ABA,即count=1;
sprintf( p2, "%i", count );把B换成1,即A1,然后 *p2++=*p1++  A1BAA

发表于 2015-05-12 22:40:07 回复(9)
难点:
1. 两个函数信息量大,没注释,要花很长时间揣摩到底什么意思
2. 要基本记住第一个函数的细节功能,才能推测第二个函数的运行过程
代码难点:
1. *p2++ = *p1++的理解
2. sprint()函数的用法,其中包含陷阱,格式化字符串末尾自带空字符'/0'
代码理解:
1. 函数FindSubString()
    输入:当前指向的字符
    输出:从当前指向的字符开始,根据字母递增、紧接着递减,判断是否存在恰好的回文字符串,存在则输出回文字符串中重复字符的数量,否则输出0。例如,ABA,则输出1,ABCBA,则输出2,BCDCBA,则输出0,因为根据字母递增递减判断,没有恰好构成回文字符串
    理解:关键在于count和count2的作用,字母递增,则count递增,停止递增后,count2被赋予和count同值,接着,字母递减,count2递减,count则保持不变。当恰好构成回文字符串时,count2递减为0,count保持回文字符串中重复字符的数量,输出count。其他情况全部输出0。
2. 函数ModifyString()
    输入:当前指向的字符
    功能:判断从当前指向的字符开始,是否恰好构成回文字符串,是,则从下一位开始更改字符串,否,则转到下一个字符
    理解:关键在于p1和p2的作用。从输入的字符串开始,利用函数FindSubString逐个判断是否恰好构成回文字符串开始的时候,p1p2均指向字符串开头,当p1p2指向某个字符x时,而从该字符x开始恰好构成回文字符串时,进入while里的if()判断后的代码块,开始更改字符...(细节太繁琐)



发表于 2018-10-01 16:41:11 回复(0)
一切运行能解决的题在实际环境面前都是纸老虎。平时做项目,出bug的时候,都是加一堆日志排问题。谁会拿着这东西在那扣,用笔算?就算程序问实现什么功能这个问题,也是日志可以解决的。 推荐大家下一个叫编程宝典的app,可以在手机上运行各种语言的代码。我刚才给第二个功能函数加了几行日志。分析了一下。我想说的是,这可以称为指针的胡乱操作吗? 思路是这样的: 第一个功能函数用来实现寻找回文序列,那个就是DNA复制的一个名词,恰好我是学制药,懂一些分子生物学。注意一点,BCDCB或者CDC都这个不是回文序列,因为BCDCB后面还有一个A,你顺着满足,逆着就不满足了,CDC就更不用说了。 第二个函数是干啥的,就是我说的“指针胡乱操作”,他要把第一个函数处理过的满足回文序列的地方做点特殊处理,让这个字符串乱套,就是这个意思。 满足特殊处理的条件就是,count>0,count2=0。这时候就是回文序列。这时候p1和p2在ABABA第一个A上。 然后,就进了第二个函数的那个奇怪处理的分支了。然后首先让*p2++=*p1;也就是p2往后走了一位,然后给这一位一个1并且追加一个结束符。然后p1后移了3位。此时P2是结束符,也就是原先长串ABABA的中间,P1在最后的BA上,然后就出了那个混乱操作了。 然后,又回到了正轨,和以前一样调用第一个函数,毕竟再没有回文序列了,P1因为刚才的跳跃,就只剩下BA,就直接循环赋值给了P2,也就是最后的ABA前面两个被BA覆盖,变成了BAA。后面整体就是A1BAA
发表于 2018-01-23 23:34:20 回复(0)
*p2++ = *p1++
1.先计算*p1:对指针p1取间接引用;
2.再计算p1++(将指针p1向后移动1个自身长度的偏移量);
3.再计算*p2:对指针p2取间接引用;
4.再计算p2++(将指针p2向后移动1个自身长度的偏移量);
5.最后将第1步所得结果赋到第3步中的内存,即*p2=*p1;

发表于 2018-04-24 15:34:17 回复(0)
对于字符串bcdcba,findsubstring()执行返回为-1,所以不做改变
发表于 2015-07-19 15:57:42 回复(0)
这样的题有啥意义,瞎蒙C都对了😂
发表于 2018-08-17 08:49:46 回复(0)
sprintf  函数重定向输出后在后面跟随一个'\0',将ABA的第二个A 覆盖,此时B已经被1代替
发表于 2018-04-03 21:13:01 回复(0)
看的我头晕眼花,懒得看了,按照高中猜选择题思路猜对了,我知道这样不好但也是一种方法233
发表于 2018-01-24 11:33:20 回复(0)
为什么每次都要手动运行一遍程序才能明白!!!感慨自己的智商(⊙o⊙)…
发表于 2017-06-03 17:52:14 回复(1)
很烦的题目,虽然会做,但是太麻烦了!!
发表于 2015-04-01 16:38:09 回复(0)
变态!!这是在考察指针的灵活应用嘛,调试了几遍代码,还是有没明白的地方。变态!!
发表于 2015-04-01 13:49:02 回复(0)
这题目也太长了,看得脑阔晕😵
发表于 2023-06-08 15:38:01 回复(0)
没意思,真遇到了也不会去写的,浪费时间看不如写其他题,人家都交卷了你还在写这一题,唯一的收获就是sprintf会自动加结束符吧
发表于 2024-11-22 23:56:48 回复(0)
这段代码定义了一组函数,主要用于处理字符串并对其进行某种修改。以下是代码的逐步解释:

1. **`FindSubString` 函数**:
   - **功能**:统计字符串中连续递增或递减的字符数量。
   - **参数**:`char* pch` 是指向字符数组的指针(字符串)。
   - **过程**:
     - 初始化 `count` 为 0,用于记录连续递增的字符数量。
     - 指针 `p1` 初始化为 `pch`,用于遍历字符串。
     - 第一个 `while` 循环:如果当前字符和下一个字符的 ASCII 值相差 1(在递增),则指针 `p1` 向后移动,并增加 `count`。
     - 第二个 `while` 循环:进行类似的检查,但判断字符是否为递减(当前字符和下一个字符的 ASCII 值相差 -1),并减少 `count2`。
     - 如果 `count2` 最终为 0,返回 `count`,否则返回 0。

2. **`ModifyString` 函数**:
   - **功能**:修改传入的字符串,统计每个连续的递增或递减字符,并用数字替换这些字符。
   - **参数**:`char* pText` 是要修改的字符串。
   - **过程**:
     - 指针 `p1` 和 `p2` 初始化为 `pText`,`p2` 用于构建修改后的字符串。
     - 在 `while` 循环中调用 `FindSubString` 函数来获取递增字符的数量。
     - 如果找到连续的递增字符,将其第一个字符复制到 `p2` 中,并使用 `sprintf` 将 `count` 的值转换为字符串,接着移动 `p2` 的指针。
     - 要跳过被替换的字符,`p1` 向前移动 `count + count + 1`(包含了字符本身和它们的数量)。
     - 否则,将当前字符直接复制到 `p2`,并移动指针。

3. **`main` 函数**:
   - **功能**:主程序,定义一个字符串并调用 `ModifyString` 进行处理。
   - 创建的 `text` 字符串为 `"XYBCDCBABABA"`,然后调用 `ModifyString(text)` 处理字符串,并打印修改后的结果。

总结:这段代码的目的是查找字符串中连续递增的字符,并用其数量替换这些字符。最终输出的是处理后的字符串。

发表于 2024-09-05 16:14:24 回复(0)