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

时间:2015-10-15 03:41:38

标签: c++ arrays getline c-strings

我接受格式(123) 456-7890的用户输入,并按照我指定的指令将其存储到char数组中。我想将该输入的JUST数字复制到另一个数组中,因此我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

为什么要复制nums[]尾部digit[]的全部内容?

如何只使用7896781234来获得一个干净的数组?

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

我认为cin.getline只存储MAX定义的第n个第n个字符

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

C / C ++中的数组必须为空终止(它们的最后一个字符必须为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个字符和你的程序,这会导致缓冲区溢出并导致崩溃,因为你的操作系统检测到你正试图访问你不是应该访问并关闭你的程序。

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

至于你的打印值有奇怪的错误可能与我前面提到的缓冲区溢出有关。