【问题标题】:Strange pointer behaviour in loop循环中的奇怪指针行为
【发布时间】:2014-12-29 17:15:47
【问题描述】:

我不知道为什么这段代码不起作用。 (我知道如何解决它,但我对这个特定的解决方案很感兴趣)它需要一个字符串并将放在另一个字符串的末尾。 x = "abc"y = "def" 和执行 foo 后,x = "abcdef"。执行我的代码后,我只得到"abc"

#include <stdio.h>
#define MAX 10

void foo(char *x, char *y){
    while(*x++);
    while(*y){
        *x++ = *y++;
    }
    *x = '\0';
}

int main(void){
    char x[MAX+1], y[MAX+1];
    scanf("%s %s", x, y);
    foo(x, y);
    printf("%s", x);
    return 0;
}

如果我这样做,代码可以正常工作。

while(*x) x++;

【问题讨论】:

  • 你问的是while(*x++);while(*x) x++;之间的区别吗?如果是这样,您的大部分代码都是无关紧要的。
  • while(*x++); 将在找到 null 后增加 xwhile(*x) x++; 不会。
  • @juanchopanza 他并没有特别问这个问题。他给出的代码是他开发的问题的一部分,所以它不是没用的!
  • 当前代码上的 cmets: 1) this: 'int main(void){' 应该是: 'int main(){' 2) 应该检查 scanf() 的返回值以确保操作正确成功 3) 用户很容易超出输入缓冲区,因此在 scanf() 中的 '%s' 格式说明符上设置最大输入字符数 4) foo() 应该检查 x 中字符串的长度和y 以确保这些字符串的 concat 适合 x。 5) foo() 当前保留来自 x 的字符串终止符 nul 字节,它应该覆盖它
  • @user3629249 实际上在 C 中,当函数不带任何参数时,输入 int main(void) 是正确的。

标签: c++ c string pointers


【解决方案1】:

这个表达式将增加x,即使在发现空值并且循环完成后:

while(*x++);

在这种情况下,您将在 null 之后附加第二个字符串,因此字符串的一部分不会“看到”。字符串变为"abc\0def"

当找到 null 时,以下内容不会增加 x,因此循环完成后 *x 将指向 null:

while(*x) x++;

因此,在这种情况下,您的字符串正确显示为 "abcdef"

【讨论】:

  • @Gopi 对,不过是后增量,所以对增量前的指针应用了解引用。
【解决方案2】:

这个循环:

while(*x++);

x 移动到空终止符之后。因此,您的 c 字符串在与以前相同的位置结束。 y 中的字符被写入x,但它们在 空终止符之后,因此它们不会被打印出来。

【讨论】:

    【解决方案3】:

    当你使用

    while(*x++);
    

    x 指向语句末尾的空字符后一位。实际上,你最终得到了

    x[] = {'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0', ....}
    

    main.

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 2020-01-22
      • 2014-02-19
      • 2020-11-28
      • 2021-07-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多