首页 > 试题广场 >

假设在上下文和头文件正常的情况以下,下面程序的结果是什么()

[单选题]
假设在上下文和头文件正常的情况以下,下面程序的结果是什么()
char* f(char *str, char ch) { 
    char *it1 = str; 
    char *it2 = str; 
    while (*it2 != '\0') { 
        while (*it2 == ch) { it2++; } 
        *it1++ = *it2++; 
     } 
    return str; 
} 
int main(int argc, char *argv[]) { 
    char *a = new char[10]; 
    strcpy(a, "abcdcccd"); 
    cout << f(a, 'c'); 
}
  • abdcccd
  • abdd
  • abcc
  • abddcccd
  • Access Violation
其实类似于STL中的排序字符串去重函数
发表于 2019-06-04 10:38:57 回复(0)
使用VS2015调试这段代码的过程如下:
    断点设置在 f 函数的while循环前,单步调试。
    这段代码很容易在指针中迷失方向,我们只要抓住这个要点即可理解:
        在刚开始时 it1与it2都指向传进来的str,在整个循环的过程中 it2 只是改变了指针的指向;而 it1 改变指针指向的同时相应的内容也改变了,从而导致str对应的内容也被改变。

所以, f 函数执行后的结果为:

编辑于 2019-04-27 09:22:21 回复(0)
最开始这道题我也选的B但是仔细分析后发现答案是D的。看下面这段代码:
 while(*it2 != '\0')
 {
        while(*it2 == ch) { it2++; }
        *it1++ = *it2++;
    }
     it1的前两个字符为ab没有异议,当it2的指针指向c时执行 it2++,运行后it2指向d,然后下一个字母不为c,所以it1的指针内复制为d,即此时it1为abd,之后遇到3个c,执行 it2++,直到it2指向d时才将d赋值给it1,也就是此时it1=abdd,但是接下来it2已经为空了,也就是“\0”,所以就不执行循环了,但是it1内本身后面还有cccd,前面的四个字母只是it2覆盖成abdd,所以最终的答案是abddcccd也就是D
发表于 2015-07-01 21:58:43 回复(17)
应该为D吧,一层while的结束条件为*str2 != ''
所以不会把'\0'放到*str1中,只是吧后边的不为c的往前放
编辑于 2021-11-17 17:25:24 回复(0)
这段代码我测试过,答案就选择d,it2的指针跑的太快了,如果仅仅每次出现一个字母,就会被后面的字母覆盖掉,其中的
 *it1++ = *it2++;可以分解为
       *it1 = *it2;
       it1++;
       it2++;
  

发表于 2015-10-27 15:05:58 回复(3)
指针进行赋值时,只是做了值覆盖,没有进行clean ,所以会有原值存在
发表于 2017-03-28 14:47:20 回复(0)
第一次当 *it2='c'时; it2++; *it2='d'; *it1指向第一个'c'; *it1++ = *it2++='d', 第一个'c'被改写为'd'; *it2++; it2为'c', 进入while (*it2 == ch)出来后*it2为'd'; 而*it1 指向 'd'; *it1++ = *it2++将'd'改写为'd'不变,*it2为'\0',循环结束; 结果只有第一个'c'被改; 故答案为abddcccd
发表于 2018-12-05 11:52:47 回复(0)
while (*it2 != '\0') {    
        cout << *it1 <<'\t'<< *it2 << endl;
        while (*it2 == ch) {    //多次循环
            it2++;
            cout << "it2:" << it2 << endl;
        }           
        cout << it1 << '\t' << it2 << endl;
        *it1++ = *it2++;
        cout << *it1 << '\t' << *it2 << endl;
        cout << it1 << '\t' << it2 << endl;
    }
如此调试,看输出结果,答案一目了然

第1次大循环
a       a
abcdcccd        abcdcccd
b       b
bcdcccd bcdcccd

第2次大循环
b       b
bcdcccd bcdcccd
c       c
cdcccd  cdcccd

第3次大循环
c       c
it2:dcccd
cdcccd  dcccd
d       c
dcccd   cccd

第4次大循环
d       c
it2:ccd
it2:cd
it2:d
dcccd   d
c
cccd

abddcccd
发表于 2020-07-17 15:50:18 回复(0)
卡在了*和++的运算符谁优先级更高的问题上了,我说怎么半天都做不出来。两种情况,优先级不一样
情况1:
当单独出现 *p++;时,根据从右向左的原则,++高于*
情况2:(本题情况)
当有表达式时,*高于++
*it1++ = *it2++;

发表于 2019-02-25 11:45:25 回复(0)
所以其实是指针传值的思想
发表于 2018-07-07 15:46:57 回复(0)
*it1++=*it2++;
这个语句的意思是,
先*it1=*it2;  访问it2所指向的地址,获得存储单元中的内容,赋给it1所指向的存储单元;
然后it1+;it2+;两个指针变量指向的地址一起+1
发表于 2018-04-11 15:36:13 回复(2)
只进行了前四个值覆盖,后面四个值it1原来就有
发表于 2017-08-25 08:48:31 回复(0)
答案 B
函数功能是把字符串去除指定的字符。

编辑于 2015-06-05 17:41:21 回复(1)
就是it1和it2都是cpy了字符串在里面,while循环式找出c逃过指向下一个,知道最后一位是d结束
不是c的就执行下面的语句将其赋值到st1中只覆盖前四项

新手 如有不对请指正
发表于 2023-11-30 15:20:54 回复(0)
当第一次*it2==c 是循环,it2++指向下一个字母,下一个字母不是 c,退出循环,剩下的拷贝到*it1 中也就是 it1 所指的字母上
发表于 2023-10-02 13:25:08 回复(0)
为什么当it2把d赋值给it1之后,it2就变成了'\0'了
发表于 2023-09-06 18:28:47 回复(0)
在*it2==c之前,it1和it2是同步增加的,第一次遇到c时,it1和it2都指向c,然后it2+1,指向d,*it1=*it2,d取代了c,it1,it2自增,it1指向了d,it2指向了c,此时it1停滞,it2循环,自增至指向最后一个d,循环结束,*it1=*it2,此时已经变成了abdd,it1和it2再自增,此时*it2=‘\0’,结束循环,此时str已经被改变为“abddcccd”
发表于 2023-05-04 01:59:38 回复(0)
间断性循环的问题: 首先it1和it2都指向数组str,被调用的函数中有两个循环,外循环的退出条件是直到遇到'\0',内循环的退出条件是非'c'。  当遇到非'c'字符时,直接退出循环执行*it1++=*it2++;语句,{此时1指针和2指针指向同一个字符} 直到遇到'c'字符,会对it2自加加{指针指向下一个字符},通过执行内循环外的语句,第一次会将'c'更改为'd',{此时1指针指向第3个字符,2指针指向第4个字符} 2指针指向第四位'd'会再次将'd'赋值给第3个字符,{此时1指针指向第4个字符,2指针指向第5个字符} 开始连续的三个'c'字符,在内循环内进行三次,只移动指针不更改相应的值,直到遇到'd',退出内循环{此时1指针指向第4个字符,2指针指向第8个字符},执行内循环外的语句,会将第8位的'd'赋值给第4位,此时2指针指向字符'\0',跳出外循环。所以最后str为abddcccd。 也就是说,这个过程改了第三位和第四位,第三位被修改两次,第四位被修改一次;
发表于 2022-04-08 01:14:00 回复(0)
去掉指定字符c,但是it2指针提前扫完了退出循环,原来的str后面四位没变。拼一起是d
发表于 2022-03-10 14:37:04 回复(0)
tr2 中如果内部遇到 c 就会一直向后走,直到没有遇到 c ,就把当前字符赋给 str1 中的循环位置的字符
发表于 2022-01-17 08:58:13 回复(0)