Puts和获取在c ++中

时间:2016-12-19 14:31:50

标签: c++

我知道什么是放置和做什么,但我不明白这段代码的含义。

int main(void) {
    char s[20];   
    gets(s); //Helloworld
    gets(s+2);//dog
    sort(s+1,s+7);
    puts(s+4);
}

你能帮我理解一下吗?

3 个答案:

答案 0 :(得分:1)

沿着这些方向在纸上画画。

首先,有20个未初始化的元素:

| | | | | | | | | | | | | | | | | | | | |

gets(s)

|H|e|l|l|o|w|o|r|l|d|0| | | | | | | | | |

gets(s+2)

|H|e|d|o|g|0|o|r|l|d|0| | | | | | | | | |
     ^
     |
    s+2

sort(s+1, s+7)

|H|0|d|e|g|o|o|r|l|d|0| | | | | | | | | |
   ^           ^
   |           |
  s+1         s+7

puts(s+4)

|H|0|d|e|g|o|o|r|l|d|0| | | | | | | | | |
         ^
         |
        s+4 

答案 1 :(得分:0)

关于代码的最好的说法是非常糟糕。幸运的是,它很短,但它很脆弱,不可维护且容易出错。

但是,由于上一个不是真正的答案,让我们通过代码,假设使用标准包含文件并使用“using namespace std;”:

  • char s [20];

这声明了一个包含20个字符的数组,目的是用一个以null结尾的字符串填充它。如果不知何故,字符串变大,你就麻烦了

  • 得到(S); //的Helloworld

这从stdin中读取一个字符串。不能对尺寸进行检查。该评论假定它将在Helloworld中阅读,该文章应该适合s。

  • 得到(S + 2); //狗

这将从stdin中读取第二个字符串,但它将覆盖从第三个字符开始的前一个字符串。因此,如果注释是write,则s将包含以null结尾的字符串“Hedog”。

  • 排序(S + 1,S + 7);

这将对从第二个字符到第七个字符断言ascii值的字符进行排序。使用给定的输入,我们已经有一个问题,即null字符位于第六个位置,因此它将是排序字符的一部分,因此将是第二个,因此以null结尾的字符串将为“H”。

  • 放(S + 4);

从第五个位置写出字符串,直到为“Helloworld”读入的null-charater,然后覆盖并进行半分类。当然输入可以是任何东西,所以期待惊喜。

答案 2 :(得分:-2)

  gets(s); //Helloworld   -- reads a string from keyboard to s
  gets(s+2);//dog         -- reads a string from keyboard to s started with char 2
  sort(s+1,s+7);          -- sorts s in interval [1, 7]
  puts(s+4);              -- writes to console s from char 4

得到(S); // Helloworld - > S =的的Helloworld

得到(s + 2); //狗 - > S =他的

排序(S + 1,S + 7); - > S =ħ的 DEGO

放(S + 4); - >控制台= Hdeg的 0