gpt4 book ai didi

c - "ss+1"在 scanf ("%s", ss+1) 中意味着什么?

转载 作者:行者123 更新时间:2023-11-30 20:47:50 26 4
gpt4 key购买 nike

我想知道输入“+1”是什么意思

scanf("%s", ss+1)

其中 ss 是字符串输入。

我正在解决 codechef 上的一个问题,当我尝试阅读其他一些解决方案以了解其他可能的解决方案/方法时,我喜欢在代码中使用它。

最佳答案

假设你有这个数组:

char a[10];

我们可以想象它看起来像这样:

   +---+---+---+---+---+---+---+---+---+---+
a: | | | | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+

假设您调用 scanf 将字符串读入数组:

scanf("%s", a);

假设您输入“hello”。数组的填充方式如下:

   +---+---+---+---+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 | | | | |
+---+---+---+---+---+---+---+---+---+---+

假设您设置一个指向数组的指针,并将该指针传递给 scanf:

char b[10];
char *p = b;

scanf("%s", p);

现在发生了完全相同的事情:p 指向字符串的开头,因此这就是 scanf 存储它读取的字符串的位置:

       +---+---+---+---+---+---+---+---+---+---+
b: | h | e | l | l | o |\0 | | | | |
+---+---+---+---+---+---+---+---+---+---+
^
+-----|-----+
p: | * |
+-----------+

最后,假设我们有另一个数组和另一个指针,但我们不是将指针传递给 scanf,而是在将指针传递给 scanf 之前将指针加 1:

char c[10];
char *ss = c;

scanf("%s", ss + 1);

现在 scanf 接收到一个指向数组中第二个单元格的指针,因此它就是在其中写入字符串:

        +---+---+---+---+---+---+---+---+---+---+
c: | | h | e | l | l | o |\0 | | | |
+---+---+---+---+---+---+---+---+---+---+
^
+-----|-----+
ss: | * |
+-----------+

这有点令人困惑。更容易看出我们是否在侧面进行加法。如果我们用一些其他字符预先填充数组,也更容易查看:

char d[10] = "rstuvwxyz";

所以最初d看起来像这样:

        +---+---+---+---+---+---+---+---+---+---+
d: | r | s | t | u | v | w | x | y | z |\0 |
+---+---+---+---+---+---+---+---+---+---+

现在,如果我们这样做,并再次输入“hello”:

char *p1 = d;
char *p2 = p1 + 1;

scanf("%s", p2);

我们最终得到的图片如下所示:

    +-----------+
p1: | * |
+-----|-----+
|
v
+---+---+---+---+---+---+---+---+---+---+
d: | r | h | e | l | l | o |\0 | y | z |\0 |
+---+---+---+---+---+---+---+---+---+---+
^
+-----|-----+
p2: | * |
+-----------+

scanf 读取到 p2 指向的位置,这是 p1 指向的位置,即数组 d 的开头.

如果你想确认发生了什么,可以执行printf("%s\n", d)。如果您在 scanf 调用之前执行此操作,则应打印 rstuvwxyz,如果您在 scanf 调用之后执行此操作(并且如果您继续键入“hello”)它应该打印 rhello

乍一看,这可能看起来相当神秘,但它是指针算术的简单应用。 (当我说 p = b 之类的东西时,也发生了一些轻微的魔法,其中 p 是一个指针,b 是一个数组,并且指针最终指向数组的第一个字符。这是 C 语言中非常重要的特殊规则,您很快就会想要了解它。)

还有另一个 Unresolved 大问题,即为什么有人想要以这种方式编写代码。这更难解释。我可以想象的一种可能性是它是一个更大程序的一部分,由于某种原因试图将大量字符串存储到同一个数组中,如下所示:

              +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
longer_array: | c | a | t |\0 | d | o | g |\0 | c | o | w |\0 | b | e | a | r |\0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

如果在较大的程序中,指针ss指向\0a之前读取的字符串的末尾,则ss + 1 确实是开始阅读下一篇文章的正确位置。

(但我只是猜测。如果没有看到更大的程序,就无法知道它为什么要读取 ss + 1。事实上,这是一件不寻常的事情。)

关于c - "ss+1"在 scanf ("%s", ss+1) 中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com