【问题标题】:C++ Phone Number ProgramC++ 电话号码程序
【发布时间】:2017-04-29 04:45:42
【问题描述】:

我是这个论坛的新手,正在寻求帮助,任何帮助将不胜感激!我被困在我的编程基础 1 课的这个作业上,并且在这一点上很绝望,因为我已经连续几个小时被困住了。谢谢。

这里是提示: 许多网站要求提供电话号码。问题是有这么多 表示电话号码的不同方式。示例包括 817-555-1234, 817 555 1234 (c) 和 (817) 555-1234 x23。编写一个输入的 C++ 程序 包含任何格式的电话号码的字符串,并以标准输出 格式。对于此分配,标准格式为 (817)555-1234。 您的 c++ 程序应该: 1. 输入包含数字的字符串 2. 仅将输入字符串中的数字复制到另一个字符串中 3. 如果输入字符串不正好包含 10,则发出错误消息 数字 4.以标准格式输出电话号码

#include "stdafx.h"
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <cctype>
using namespace std;

const int NUM_LENGTH = 10;

string ReadAndValidateUserNumber(string userNumber);

int main()
{
    string userNumber;

    ReadAndValidateUserNumber(userNumber);

    system("PAUSE");
    return 0;
}

string ReadAndValidateUserNumber(string userNumber)
{
    bool check = false;

    while (!check)
    {
        check = true;

        cout << "Please enter a Number: ";
        cin >> userNumber;

        if (userNumber.length() != NUM_LENGTH)
            cout << "The phone number may contain 10 digits only. \n";

        else
        {
            userNumber.insert(0, "(");
            userNumber.insert(4, ")");
            userNumber.insert(8, "-");

            for (int i = 0; i < userNumber.length(); i++)
            {
                if (isdigit(userNumber[i]))
                {
                    userNumber = NUM_LENGTH;
                }
            }
        }

        if (!check)
        {
            cout << "Invalid Entry! Please try again." << endl;
        }
    }

    return userNumber;
}

【问题讨论】:

  • 错误是什么?什么是正确的行为?输出不良的例子?请明确点。这不是要求人们为您编写代码的地方。
  • 我很抱歉。例如,如果我只输入 10 位数字“1123456789”,它只会说按任意键继续。如果我输入“123-456-9999”之类的内容,它会说错误,必须只有 10 位数字。
  • 我想让程序吐出(123)456-9999格式的数字。我只是不知道如何以及如何使用“isdigit”从字符串中提取数字并忽略任何字母。
  • 对原始用户输入应用十位数限制是不正确的。只有在解析字符串并提取所有数字之后,您才能验证该数字计数。所以放弃对字符串长度的检查。
  • @Incomputable 如果他在数字组之间添加括号或破折号,他会将整个字符串长度超过 10 个字符并触发错误消息。

标签: c++ c++11 visual-c++


【解决方案1】:

您似乎有一个逻辑错误。

bool check = false;

while (!check)
{
  check = true;

  ....

  if (!check)
  {
        cout << "Invalid Entry! Please try again." << endl;
  }
}

您会注意到 check 永远不会再次变为 false。因此,底部的 if 语句永远不会执行,并且循环永远不会迭代超过一次,因为 check 始终为真。你可能想做

check = true 

以输入的正确格式为条件。

【讨论】:

    【解决方案2】:

    代码处于可怕的状态。冷静下来,集中注意力。除了你写的,还有很多问题。我建议您将工作代码带到任何代码审查站点。

    你做错了检查,检查错后你在做什么。

        userNumber = NUM_LENGTH;
    

    这会将NUM_LENGTH 截断为字符,因此userNumber 内部会有一些奇怪的东西。

    这是正确的检查:

                if (!isdigit(userNumber[i]))
                {
                    std::cout << "input should be only numbers\n";
                    return; //function should return void
                }
    

    ^^ 如果你想中断非数字输入,你应该这样做,如果你想跳过非数字,你可以使用 std::copy_if 到另一个字符串,或者调整上面的东西来为你做。如果你想删除非数字的东西,你也可以使用std::remove_if

    std::string fetched_input;
    std::copy_if(userNumber.begin(), userNumber.end(), fetched_input.begin(), std::isdigit);
    

    ^^ 这只会给你带数字的字符串。

    另外,您没有在正确的地方进行检查。再想想吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多