【问题标题】:Basic C-style string copy基本 C 风格的字符串复制
【发布时间】:2011-10-25 01:34:54
【问题描述】:

我正在尝试进行 C 风格的字符串复制,但有些东西无法正常工作。我做错了什么?

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main() {
    char string_a[20]="Good day!";
    char string_b[30]="Hi!";
    int i=0;
    cout << "string a: " << string_a << endl;
    cout << "string b: " << string_b << endl;
    while (*string_a++ = *string_b++) {
        cout << ++i << endl;
    }
    cout << "string a: " << string_a << endl;
    cout << "string b: " << string_b << endl;
    return 0;
}

【问题讨论】:

  • 最好在问题正文中添加单词和短语,而不是“解决方法”。
  • 也许仅仅标题就足以解决这个问题......但是,对于 Stack Overflow 来说不是。你至少可以提到为什么它失败了。
  • 两个问题。您已将 string_astring_b 声明为数组,而不是指针。因此,它们的地址是不可变的,所以string_a++string_b++ 应该会产生错误。此外,最好写while ((x=y) != '\0') 以明确您正在复制结果并将结果与​​空字符进行比较。一般来说,单个= 作为ifwhile 条件是一个危险信号。
  • 写起来很容易,例如,while (var1 = var2) 当你真正的意思是(while var1 == var2)。更糟糕的是,当您扫描代码时可能很难找到这点,因为您会看到您的意思,而不是您写的内容。我发现试图展示自己熟练程度的新程序员倾向于使用更简单的while (var1 = var2),而更有经验的专业人士倾向于使用更容易维护的while ((var1 = var2) != 0)。预先保存几个字符可能会在数小时后花费,这是假设错误没有出现在现场的情况下。
  • 假设它是一个错误,并假设它有助于查看它。我不会混淆===。但是看到!= '\0' 让我头疼。

标签: c++ arrays string pointers


【解决方案1】:

你不能这样做:

string_a++

如果string_a 被定义为一个数组。这仅适用于指针,而数组仅在特定情况下衰减为指针。

如果你改变:

while (*string_a++ = *string_b++) {
    cout << ++i << endl;
}

进入:

char *pa = string_a, *pb = string_b;     // a "specific circumstance" :-)
while (*pa++ = *pb++) {
    cout << ++i << endl;
}

然后它会正常工作,输出:

string a: Good day!
string b: Hi!
1
2
3
string a: Hi!
string b: Hi!

【讨论】:

  • iirc,数组是指针,不是吗?如何将数组声明为可变指针?
  • @pax:这曾经是我最喜欢的面试问题之一。 :-)
  • 不,不,不,一百次,不 :-) 数组是 not 指针。它们在某些情况下衰减指向指针,但绝对不在您拥有的代码 sn-p 中。
  • @user1011921: 数组是 groups 项,并且名称是不可变的 - 它始终引用组(您不能修改它)。指针是指向单个项的指针(我想不出比地址更好的术语,这会引入其他复杂性)。这些指针可以更改为指向不同的项,例如上述数组中的第二项或第三项(当然,尽管有const-ness)。
  • @user1011921:不完全是。您现在正进入语言规范的黑暗深处 :-) 数组和不可变指针之间仍然存在差异,其中之一就是您在它们上使用 sizeof 时会看到的内容。对于数组int xyzzy[10]name xyzzy 指的是数组本身(十个整数)。类似不可变指针int *const plugh = &amp;xyzzy 的名称plugh 指的是一个指针,它指向xyzzy 开头的单个整数。
猜你喜欢
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多