字符串和数组的问题
Trouble with strings and arrays
我的目标是制作一个输入 phone 数字并以标准格式输出的程序。它会跳过任何非数字字符,如果没有足够的数字将输出,并且还会跳过前十位数字之后的任何数字。我的猛禽工作顺利,但很难将其翻译成 C++。
我正在使用 Microsoft Visual Studio。
问题是它不是 运行。如果我输入的数字多于一个数字,我会收到失败错误。
我在这段代码中遇到了一些困难运行。
任何和所有帮助和建议将不胜感激。
#include <iostream>
#include <string>
using namespace std;
void format(char outArray[], string inNumber)
{
outArray[0] = '(';
outArray[4] = ')';
outArray[5] = ' ';
outArray[9] = '-';
outArray[1] = inNumber[0];
outArray[2] = inNumber[1];
outArray[3] = inNumber[2];
outArray[6] = inNumber[3];
outArray[7] = inNumber[4];
outArray[8] = inNumber[5];
outArray[10] = inNumber[6];
outArray[11] = inNumber[7];
outArray[12] = inNumber[8];
outArray[13] = inNumber[9];
}
int main()
{
string phone, inNumber;
cout << "Please enter a phone number: ";
cin >> phone;
int index = 0;
int num = 0;
char outArray[14];
for (index; phone[index] >= '0' && phone[index] <= '9'; index++)
{
inNumber[num] = phone[index];
num++;
}
if (inNumber.size() > 10)
{
format(outArray, inNumber);
cout << "The properly formatted number is: ";
cout << outArray;
}
else {
cout << "Input must contain at least 10 digits." << endl;
}
system("pause");
return 0;
}
inNumber[num] = phone[index]; //undefined behavior.
你现在不能下标inNumber
,因为它的容量是0,因此它不能store或access任何元素这里。
您可能需要使用 string
的构造函数,其参数具有 size_t
类型或 string::reserve
或 string::resize
。
我很高兴看到 cppreference 现在变得更加完善,学习使用它:http://en.cppreference.com/w/cpp/string/basic_string
顺便说一句,这个函数不会做任何你想做的事:
void format(char outArray[], string inNumber)
也许你想要这样的签名?
void format(char outArray[], string& inNumber)
注意几点:
使用 std::string
代替 char
数组。
除非您不确定输入 (phone
),否则无需使用 for 循环检查章程。但是,如果是这种情况,请使用 std::getline()
获取输入并使用 range-based for
loop.
进行如下解析
您可以使用 std::isdigit
来检查 char
字符是否为数字。
My goal is to make a program that inputs a phone number and outputs it
in a standard format. It skips over any non-number characters, will
output if there are not enough digits, and will also skip over any
digits after the first ten digits.
这意味着该数字的最小长度应为 10
。然后
if
语句应该是 if (inNumber.size() >= 10)
需要在函数 format()
中通过 ref 调用传递,因为您要更改 outArray
的内容。此外,inNumber
可能是
const
ref,因为我们不更改此字符串。
更新代码:(See a sample code online)
#include <iostream>
#include <string>
#include <cstddef> // std::isdigit, std::size_t
void format(std::string& outArray, const std::string& inNumber) /* noexcept */
{
for (std::size_t index = 0; index < 10; ++index)
{
if (index == 0) outArray += '(';
else if (index == 3) outArray += ") ";
else if (index == 6) outArray += '-';
outArray += inNumber[index];
}
}
int main()
{
std::string phone;
std::cout << "Please enter a phone number: ";
std::getline(std::cin, phone);
std::string inNumber;
for (char letter : phone)
if (std::isdigit(static_cast<unsigned char>(letter))) // check the letter == digits
inNumber += letter;
if (inNumber.size() >= 10)
{
std::string outArray;
format(outArray, inNumber);
std::cout << "The properly formatted number is: ";
std::cout << outArray;
}
else {
std::cout << "Input must contain at least 10 digits." << std::endl;
}
return 0;
}
我的目标是制作一个输入 phone 数字并以标准格式输出的程序。它会跳过任何非数字字符,如果没有足够的数字将输出,并且还会跳过前十位数字之后的任何数字。我的猛禽工作顺利,但很难将其翻译成 C++。
我正在使用 Microsoft Visual Studio。 问题是它不是 运行。如果我输入的数字多于一个数字,我会收到失败错误。
我在这段代码中遇到了一些困难运行。 任何和所有帮助和建议将不胜感激。
#include <iostream>
#include <string>
using namespace std;
void format(char outArray[], string inNumber)
{
outArray[0] = '(';
outArray[4] = ')';
outArray[5] = ' ';
outArray[9] = '-';
outArray[1] = inNumber[0];
outArray[2] = inNumber[1];
outArray[3] = inNumber[2];
outArray[6] = inNumber[3];
outArray[7] = inNumber[4];
outArray[8] = inNumber[5];
outArray[10] = inNumber[6];
outArray[11] = inNumber[7];
outArray[12] = inNumber[8];
outArray[13] = inNumber[9];
}
int main()
{
string phone, inNumber;
cout << "Please enter a phone number: ";
cin >> phone;
int index = 0;
int num = 0;
char outArray[14];
for (index; phone[index] >= '0' && phone[index] <= '9'; index++)
{
inNumber[num] = phone[index];
num++;
}
if (inNumber.size() > 10)
{
format(outArray, inNumber);
cout << "The properly formatted number is: ";
cout << outArray;
}
else {
cout << "Input must contain at least 10 digits." << endl;
}
system("pause");
return 0;
}
inNumber[num] = phone[index]; //undefined behavior.
你现在不能下标inNumber
,因为它的容量是0,因此它不能store或access任何元素这里。
您可能需要使用 string
的构造函数,其参数具有 size_t
类型或 string::reserve
或 string::resize
。
我很高兴看到 cppreference 现在变得更加完善,学习使用它:http://en.cppreference.com/w/cpp/string/basic_string
顺便说一句,这个函数不会做任何你想做的事:
void format(char outArray[], string inNumber)
也许你想要这样的签名?
void format(char outArray[], string& inNumber)
注意几点:
使用
std::string
代替char
数组。除非您不确定输入 (
进行如下解析phone
),否则无需使用 for 循环检查章程。但是,如果是这种情况,请使用std::getline()
获取输入并使用 range-basedfor
loop.您可以使用
std::isdigit
来检查char
字符是否为数字。My goal is to make a program that inputs a phone number and outputs it in a standard format. It skips over any non-number characters, will output if there are not enough digits, and will also skip over any digits after the first ten digits.
这意味着该数字的最小长度应为
10
。然后if
语句应该是if (inNumber.size() >= 10)
需要在函数
format()
中通过 ref 调用传递,因为您要更改outArray
的内容。此外,inNumber
可能是const
ref,因为我们不更改此字符串。
更新代码:(See a sample code online)
#include <iostream>
#include <string>
#include <cstddef> // std::isdigit, std::size_t
void format(std::string& outArray, const std::string& inNumber) /* noexcept */
{
for (std::size_t index = 0; index < 10; ++index)
{
if (index == 0) outArray += '(';
else if (index == 3) outArray += ") ";
else if (index == 6) outArray += '-';
outArray += inNumber[index];
}
}
int main()
{
std::string phone;
std::cout << "Please enter a phone number: ";
std::getline(std::cin, phone);
std::string inNumber;
for (char letter : phone)
if (std::isdigit(static_cast<unsigned char>(letter))) // check the letter == digits
inNumber += letter;
if (inNumber.size() >= 10)
{
std::string outArray;
format(outArray, inNumber);
std::cout << "The properly formatted number is: ";
std::cout << outArray;
}
else {
std::cout << "Input must contain at least 10 digits." << std::endl;
}
return 0;
}