字符串和数组的问题

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,因此它不能storeaccess任何元素这里。

您可能需要使用 string 的构造函数,其参数具有 size_t 类型或 string::reservestring::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;
}