在C++中操作字符串的程序中将循环控制变量更改为char类型(最初是size_t类型)

问题描述 投票:0回答:1

我正在从 C++ 入门书(5E)学习 C++,练习 3.6 说: “使用范围将字符串中的所有字符更改为 X。” . 相反,我尝试更进一步,将除最后 4 个字符之外的所有字符更改为 X,就像信用卡详细信息一样。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
    cout << "Enter you credit card number: ";
    string ccno;
    cin >> ccno;
    for (decltype(ccno.size()) c = 0; c < ccno.size() - 4; ++c)
        ccno[c] = 'X';
    cout << ccno << endl;
    return 0;
}

它给出了想要的结果。 然后我进入下一个练习(3.7),其中说: “如果将上一个练习中的循环控制变量定义为 char 类型,会发生什么?预测结果,然后更改程序以使用 char 来查看是否正确。” .

我继续将初始类型更改为 char 类型:

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
    cout << "Enter you credit card number: ";
    string ccno;
    cin >> ccno;
    for (char c = 0; c < ccno.size() - 4; ++c)
        ccno[c] = 'X';
    cout << ccno << endl;
    return 0;

出乎意料的是,它没有引发任何错误消息,并再次给出与之前相同的(所需的)输出。

例如

input: whatever
output: XXXXever

所以我决定检查这些练习的非官方答案,并发现了这些:

对于 3.6:

#include <iostream>
#include <string>

using std::cout;
using std::string;

int main()
{
    string str = "gaoxiangnumber1";
    for(char &ch : str)
    {
        ch = 'X';
    }
    cout << str;

    return 0;
}
/*
Output:
XXXXXXXXXXXXXXX
*/

对于 3.7:

#include <iostream>
#include <string>

using std::cout;
using std::string;

int main()
{
    string str = "gaoxiangnumber1";
    for(char ch : str)
    {
        ch = 'X';
    }
    cout << str;

    return 0;
}
/*
Output:
gaoxiangnumber1
*/

令人惊讶的是,他们的输出是不同的。对于 3.7,它根本不会改变给定的字符串。

我尝试在 StackOverflow 上查找类似的问题,但找不到任何相关的问题。即使我这样做了,我也太新手了,无法意识到它们是类似的问题,并且无法理解这些问题。

是因为我在 for 循环中将 'c' 与 size_t 数据类型进行比较,所以它以某种方式改变了反手的 c 类型还是其他什么?或者是因为我接受的输入与预先初始化它的非官方答案不同(这听起来像是最愚蠢的原因,但是是的)

c++ string char size-t
1个回答
0
投票

书中使用了基于范围的for循环。在第一个 for 循环中使用了对字符串中字符的引用。因此在循环内原始字符串正在被更改。

在第二个 for 循环中使用了字符串字符的副本。因此更改副本不会导致更改原始字符串。

至于当 bith 循环扭曲时的 for 循环。如果用户输入的字符串少于 4 个字符,那么您将得到未定义的行为,因为表达式

ccno.size() - 4
可以产生非常小的正值。

© www.soinside.com 2019 - 2024. All rights reserved.