【问题标题】:Please explain the output of the following pointer operation [closed]请解释以下指针操作的输出[关闭]
【发布时间】:2017-02-13 06:40:55
【问题描述】:

我一直在试图弄清楚如何得出以下程序的输出。我基本上想知道每次迭代后字符数组的状态。会有很大帮助的。

#include<iostream.h>
#include<conio.h>
#include<ctype.h>
void main()
{
 char *name="ThE bESt meN wIN";
 for(int i=0;name[i]!='\0';i++)
 {
  if(islower(name[i]))
     name[i]=toupper(name[i]);
  else
  if(isupper(name[i]))
  {
   if(i%2==0)
    name[i]--;
   else
    name[i]=tolower(name[i-1]);
  }
  }
  cout<<name;
 getch();
}

输出是: SHD BbRT MEe WHh

【问题讨论】:

  • 离题。您正在使用四分之一世纪的编译器。当您将知识转移到其他应用程序时,预计会遇到一些困难。
  • 你正在写入一个指向不可变内存的指针
  • 代码的行为未定义。所以没有解释就足够了。
  • @LWimsey 这是 OP 必须面对的障碍之一。
  • @BhargabKakati 看起来像是来自拼图的代码。将字符串写在一张纸上,“手动”循环并写下结果是可行的

标签: c++ arrays string pointers output


【解决方案1】:

将您的main 返回类型更改为int 并修改此行以使其指向可以修改的字符数组:

char name[]="ThE bESt meN wIN";

然后一步一步来,这里是 16 次迭代中每一次的输出。数字是指实际的数组索引。那应该会有所帮助。

也许这更容易处理,如果不使用历史记录

initial
ThE bESt meN wIN


0123456789012345
ShE bESt meN wIN  0: T -> S

0123456789012345
SHE bESt meN wIN  1: h -> H

0123456789012345
SHD bESt meN wIN  2: E -> D

0123456789012345
SHD bESt meN wIN  3: space

0123456789012345
SHD BESt meN wIN  4: b -> B

0123456789012345
SHD BbSt meN wIN  5: E -> b

0123456789012345
SHD BbRt meN wIN  6: S -> R

0123456789012345
SHD BbRT meN wIN  7: t -> T

0123456789012345
SHD BbRT meN wIN  8: space

0123456789012345
SHD BbRT MeN wIN  9: m -> M

0123456789012345
SHD BbRT MEN wIN  10: e -> E

0123456789012345
SHD BbRT MEe wIN  11: N -> e

0123456789012345
SHD BbRT MEe wIN  12: space

0123456789012345
SHD BbRT MEe WIN  13: w -> W

0123456789012345
SHD BbRT MEe WHN  14: I -> H

0123456789012345
SHD BbRT MEe WHh  15: N -> h

【讨论】:

  • 谢谢。在第一次迭代 i=0 中,T 如何变为 S ?
  • 现在知道了..非常感谢。 LWimsey
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多