将内容从一个字符数组复制到另一个字符数组但变得垃圾

copying contents from one char array to another but getting junk

我正在接受格式为 (123) 456-7890 的用户输入,并根据分配的指令将其存储到一个字符数组中。我只想将该输入的数字复制到另一个数组中,所以我有 1234567890 并省略 ( ) -.

我使用 cin.getline() 获得了最初格式化的用户输入,我使用 for 循环将数字仅传输到第二个数组,但我得到了一个奇怪的输出。这是代码:

int main()
{
    const int MAX = 15, dMAX = 10;

    char nums[MAX], digit[dMAX];
    int usableN, rdx = 0;


    cout << "Enter phone number in (XXX) XXX-XXXX format:  ";
    cin.getline(nums, MAX);

    for (int i = 1; i < 4; i++)
    {
        digit[rdx] = nums[i];
        usableN = atoi(digit);
        cout << digit << endl;
        rdx++;
    }

    for (int i = 6; i < 9; i++)
    {
        digit[rdx] = nums[i];
        usableN = atoi(digit);
        cout << digit << endl;
        rdx++;
    }

    for (int i = 10; i < 14; i++)
    {
        digit[rdx] = nums[i];
        usableN = atoi(digit);
        cout << digit << endl;
        rdx++;
    }

    cout << endl << digit << endl;

    return 0;
}

现在,请忽略 usableN = atoi(digit);,因为它供以后使用。多个 cout << 部分是这样我可以看到每一步存储的内容。现在,这是我无法理解并需要帮助的部分:

我的输出充满了垃圾,尽管我使用了 const int dMAX = 10;,但我的数组有 24 个字符长。这是输出:

7Ss╨vJs╨vπ(789) 678-1234
78s╨vJs╨vπ(789) 678-1234
789╨vJs╨vπ(789) 678-1234
7896vJs╨vπ(789) 678-1234
78967Js╨vπ(789) 678-1234
789678s╨vπ(789) 678-1234
7896781╨vπ(789) 678-1234
78967812vπ(789) 678-1234
789678123π(789) 678-1234
7896781234(789) 678-1234

7896781234(789) 678-1234

为什么要在 digit[] 的尾部复制整个 nums[]

如何获得一个只有 7896781234 的干净数组?

此外,我注意到每当我 cin.getline(nums, MAX) 时,如果用户输入超过 MAX 个字符,它就会崩溃!为什么会这样,我该如何防止呢?

我以为cin.getline只会存储MAX

定义的前n个字符

抱歉,这是一个冗长的解释,但我想确保我清楚我在问什么。预先感谢您对这些问题的任何帮助。

您需要确保您的字符串始终以 null 结尾。例如:

for (int i = 1; i < 4; i++)
{
    digit[rdx] = nums[i];
    digit[rdx+1] = '[=10=]';
    usableN = atoi(digit);
    cout << digit << endl;
    rdx++;
}

C/C++ 中的数组必须以 null 结尾(它们的最后一个字符必须为 0),大多数标准库(可能还有您的)代码才能正常工作。这意味着您需要通过检查当前正在读取的字符是否 == NULL 或 0 来检查是否已到达字符串的最后一个字符,如本例所示:

char String = "My string";
for(int i = 0; String[i] != 0; ++i)
{
  std::cout << "Printing a character: " << String[i] << std::endl;
}

该示例将 运行 直到打印出字符串中的所有字符。请注意 NULL 或 0 字符如何标记字符串的结尾。

当您读取一个字符数超过 MAX 的数组时,您可能会覆盖最后一个 0 字符和您的程序,这会导致缓冲区溢出 运行 并因此导致崩溃,因为您的 OS 检测到您正在尝试访问您不应该访问的内存,它会关闭您的程序。

您可能应该考虑使用标准字符串 (std::string) 而不是 char 数组,因为它们会自动增长并默认使用 getline。

至于你打印出来的值出现奇怪的错误,可能是我之前提到的buffer over运行有关