【问题标题】:How to understand C++ function/data structs?如何理解 C++ 函数/数据结构?
【发布时间】:2019-07-05 04:31:07
【问题描述】:
  1. 'strToDouble' 未在此范围内声明 Lab1-3.cpp /Lab1-3/src 第 65 行 C/C++ 问题

【问题讨论】:

  • 你应该显示你得到的实际编译错误,并清楚地指出哪一行代码产生了这些编译错误;而不是期望每个人在开始弄清楚原因之前就弄清楚哪一行代码没有编译。
  • 这应该用于代码审查网站。但是 1)using namespace std; 不好 - 谷歌 2)char title -.> 标题如何适合一个字符? 3) 阅读const 5) 阅读缓冲区溢出 6) 阅读有关刷新cout
  • ... 阅读如何使用调试器
  • @EdHeal 不,它不应该出现在代码审查中:他们只接受编译的代码,但这个问题是关于编译错误的。
  • @S01780 1) “C/C++ 问题” 没有像“C/C++”这样的语言。 2) 您是否尝试查看std::getline 的文档?你会注意到没有这样的重载,你怎么称呼它。你的意思是用std::string 代替char 来代替title? 3) strToDouble 在使用时未声明,正如错误中所述。 4) 考虑从good C++ book 学习而不是随机编码。

标签: c++


【解决方案1】:

正如@SornelHaetir 指出的那样,第一个问题是您试图将title 分配给只能包含一个字符的变量。相反,您应该使用 char 数组、char 指针甚至字符串对象来包含您的多字母值。在下面的代码示例中,我使用固定大小为 25 的 char 数组来存储标题。请注意,您最多只能在其中存储 24 个字符,因为 char 数组需要特殊字符来表示 char 数组的结尾。否则,它最终会在您想要的值之后写入 junk 。那个特殊字符是空终止字符,写成'\0'

在您的 void displayBid(Info itemOne); 函数中使用 return; 语句是完全没有必要的。虽然您可以使用return; 来停止函数的执行,但您将它放在函数的末尾,该函数即将以正常方式结束,但您无缘无故地强迫它。此外,对于返回 void 的函数,您不需要任何 return; 语句——什么都没有。

那么,fundbidAmount 代表货币价值,可能是整数值,也可能不是整数值,因此您应该考虑使用 floatdouble 数据类型来存储货币价值。

接下来是你的函数Info getBid();。首先,我不得不说命名可能有点混乱。如果您在没有看到其实际代码的情况下阅读该函数的名称,您将如何理解它可能会做什么?对我来说,这听起来像是要让我获得有关出价的信息,而实际上它正在设置它。其次,您可以简化输入值的代码,就像我在代码示例中所做的那样。您尝试使用不同技术从用户输入中获取值的方式有点错误。 getline 是与 istream 对象一起使用的成员函数。您的 istream 对象是 cin。为了访问该成员函数,您应将其写为cin.getline(待讨论);。该功能仅适用于字符。它的第一个参数接受指向字符序列中第一个字符(第一个字符的地址)的指针。

第二个参数是整数数据类型,指定要从输入中提取多少字符并存储在代替第一个参数的参数中。注意不要写,例如 25,因为在 char 数组中你必须为 '\0' 字符留一个位置,它会自动放置在它需要的位置。 getline 成员函数也有默认分隔符'\n',表示换行。这意味着您可以输入的字符少于函数可以提取的字符,因为一旦从用户输入中读取该分隔符值,提取就会停止。虽然,如果您想要特定的分隔符,getline 成员函数有其重载版本,第三个参数是您输入所需分隔符作为参数的地方。 (重载的函数基本上是同名的函数,但参数不同。它们提供相同的功能但实现不同。)

即使您已为出价设置了值,您也从未从函数中返回它。您正确地说它的返回值为Info,但您没有返回它。实际上,您在其正常退出之前再次退出。相反,你应该写 return itemOne; 在我的代码示例中,我通过引用传递了在 int main(); 函数中创建的变量,这意味着它不是通常的副本,所以我不必返回它并分配给另一个变量相同类型以适当地应用所需的更改。

最后,在int main(); 函数中,您可以只声明int choice,而不对其进行初始化,并按照我的方式使用do-while 循环。此外,switch 语句提供了定义如果所有情况都不为真时会发生什么,就像在所有情况下你写default: 一样,在它下面写下你想要发生的任何事情。在您的代码示例中,即使用户输入除 1、2 以外的任何内容(定义为停止执行的 9 除外),您的函数也将继续执行。在我的代码示例中,除了 1 和 2(包括零)用户输入的任何内容,函数都将退出。好吧,除了换行。

然后,让我们再次讨论命名。您的数据结构名称必须直接暗示它是什么。 Info 不这样做。该名称实际上更适合您的 void displayBid(Info itemOne); 函数被调用。在我的代码示例中,我将其重命名为 Bid

#include <iostream>
using namespace std;

struct Bid
{
    char title[25];
    int vehicleID;
    double fund;
    double bidAmount;
};

void GetBid(Bid item)
{
    cout << "Title: " << item.title << endl;
    cout << "Fund: " << item.fund << endl;
    cout << "Vehicle: " << item.vehicleID << endl;
    cout << "Bid Amount: " << item.bidAmount << endl;
}

void SetBid(Bid & item)
{
    cout << "Enter title: ";
    cin >> item.title;

    cout << "Enter fund: ";
    cin >> item.fund;

    cout << "Enter vehicle ID: ";
    cin >> item.vehicleID;

    cout << "Enter amount: ";
    cin >> item.bidAmount;
}

int main()
{
    Bid item;
    int choice;

    do {
        cout << "Menu:" << endl;
        cout << "  1. Enter Bid" << endl;
        cout << "  2. Display Bid" << endl;
        cout << "  0. Exit" << endl;
        cout << "Enter choice: ";
        cin >> choice;

        switch (choice)
        {
            case 1:
                SetBid(item);
                break;
            case 2:
                GetBid(item);
                break;
            default:
                choice = 0;
                cout << "Goodbye." << endl;
                break;
        }
    } while (choice != 0);

    return 0;
}

【讨论】:

  • 这看起来是一个很好的彻底的帮助。我的一点建议是,在问题作者证明他们自己已经做出了很大努力之前,提供少量建议可能是值得的。不幸的是,我有一些助手非常慷慨地付出了他们的时间,却发现他们没有得到 OP 的回复,然后他们再也没有登录。当然,答案主要是为未来的读者准备的,所以这不是一场灾难,但有时答案可能过于本地化,以至于无法获得应有的教育机会。
  • @halfer – 非常感谢您指导我如何正确写答案。下次写答案时,我会牢记您的建议。
  • 嗯,并不是因为它写得不正确——只是花一个小时研究有时会浪费掉的答案可能会“精疲力尽”。我投了赞成票!
  • @halfer – 是的,我明白你的意思。下次我会尝试让问题作者参与解决他们的问题的过程,在这种需要纠正很多事情的问题中。谢谢!
  • @Purplette 谢谢,这是非常有用的信息和帮助。我真的很感谢你的建议。你的例子给了我一些努力。 :)
【解决方案2】:

第一个(也是最大的)问题是:

char title;

这允许您仅存储单个字符而不是整个名称(首选 std::stringchar 数组)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多