将内容从一个字符数组复制到另一个字符数组但变得垃圾
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运行有关
我正在接受格式为 (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
抱歉,这是一个冗长的解释,但我想确保我清楚我在问什么。预先感谢您对这些问题的任何帮助。
您需要确保您的字符串始终以 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运行有关