C ++字符串和数组问题

时间:2018-04-27 04:20:31

标签: c++ arrays string algorithm c++11

我的目标是制作一个输入电话号码并以标准格式输出的程序。它跳过任何非数字字符,如果没有足够的数字将输出,并且还会跳过前十位数后的任何数字。我的猛禽工作顺利,但很难将其翻译成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;
}

2 个答案:

答案 0 :(得分:0)

 inNumber[num] = phone[index]; //undefined behavior.

您现在不能下标inNumber,因为它的容量为0,因此它不能存储访问这里的任何元素。

您可能需要使用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)

答案 1 :(得分:0)

有几点需要注意:

  • 使用std::string代替char数组。
  • 除非您这样做,否则您无需使用for循环检查租船人 不确定输入(phone)。但是,如果是这种情况,请使用std::getline()获取输入并使用基于for循环的范围进行如下解析。

      
        

    我的目标是制作一个输入电话号码并输出的程序     标准格式。它将跳过任何非数字字符     输出如果没有足够的数字,也会跳过任何数字     前十位数后的数字。

      
  • 这意味着该号码的最小长度为10.然后是 if声明应为if (inNumber.size() >= 10)

  • 需要在函数format()中通过ref调用传递,因为你想要 更改outArray的内容。此外,inNumber可能是一个 const ref,因为我们不更改此字符串的内容。
  • 您可以按照下面给出的数字格式,或者只是按照bcr的答案(在format()中)。

更新的代码:

#include <iostream>
#include <string>

void format(std::string& outArray, const std::string& inNumber)
{
    for(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 (const auto& letter: phone)
        if('0' <= letter && letter <= '9')
            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;
}

示例输出https://www.ideone.com/bPl5zJ