【问题标题】:Simple C++ console I/O issue简单的 C++ 控制台 I/O 问题
【发布时间】:2023-03-17 21:00:01
【问题描述】:
#include <iostream>
using namespace std;

const int Max=20;

struct bop
{
    char fullname[Max];
    char title[Max];
    char bopname[Max];
    int preference;
};

int main()
{
    bop a[5]=
    {
        {"Steve Jobs", "BFF", "Rita",0},
        {"Bill Gates", "BFF2", "Ann",1},
        {"Mark", "BFF3", "Boss", 2},
        {"Edward", "BFF4", "Jiezha", 2},
        {"Larry Page", "BFF5", "Michele", 1}
    };
    cout << "Benevolent Order of Programmers Report\n";
    cout << "a. display by name         b. display by title\n"
            "c. display by bopname      d. display by preference\n"
            "q. quit\n"
            "Enter your choice: ";
    char ch;
    (cin >> ch).get();
    int i;
    while (ch!='q')
    {
        switch (ch)
        {
            case 'a': for (i=0; i<Max; i++) cout << a[i].fullname << endl; break;
            case 'b': for (i=0; i<Max; i++) cout << a[i].title << endl; break;
            case 'c': for (i=0; i<Max; i++) cout << a[i].bopname << endl; break;
            case 'd': for (i=0; i<Max; i++)
                        switch (a[i].preference)
                        {
                            case 0: cout << a[i].fullname << endl; break;
                            case 1: cout << a[i].title << endl; break;
                            case 2: cout << a[i].bopname << endl; break;
                        }
                      break;
        }
        cout << "Next choice: ";
        (cin >> ch).get();
    }
    cout << "Bye!" << endl;
    return 0;
}

这个程序显示很多垃圾如下:

Benevolent Order of Programmers Report
a. display by name          b. display by title
c. display by bopname       d. display by preference
q. quit
Enter your choice: a
Steve Jobs
Bill Gates
Mark
Edward
Larry Page
^?&i?
'=YV?
K>YV?
f?YV?
??YV?
xterm-256color
11dry7st9vkb200000gn/T/
T3PDw/Render
anguage (C++)
B6
qUSg/Listeners
Message=/tmp/launch-Gpgr3C/Apple_Ubiquity_Message
/bin:/usr/sbin:/sbin:/usr/local/bin
ge (C++)/cpp
boris
Next choice:

谁能向我解释原因并告诉我如何纠正这个程序?我也尝试用 cin >> ch 替换 (cin >> ch).get()。它也不起作用。非常感谢!

【问题讨论】:

  • 如果您正在编写 C++,请使用 std::string 和 std::vector。一旦您熟悉了 STL,您就会体会到它所提供的优势。但是,这并不意味着您只是跳过数组。一旦你真正理解了数组和指针,就继续学习 STL。
  • @ScepticalJule 非常感谢您的建议!

标签: c++ input output


【解决方案1】:

问题在于您的内部实现。您执行以下操作:

case 'a': for (i=0; i<Max; i++) cout << a[i].fullname << endl; break;
//case 'b': ...

如果你看顶部,Max定义为20:

const int Max=20;

但是您的数组中只有 5 个成员:

bop a[5]=
{
    {"Steve Jobs", "BFF", "Rita",0},
    {"Bill Gates", "BFF2", "Ann",1},
    {"Mark", "BFF3", "Boss", 2},
    {"Edward", "BFF4", "Jiezha", 2},
    {"Larry Page", "BFF5", "Michele", 1}
};

因此,当它打印索引 6-19 的值时,它会打印垃圾。计算垃圾的行数加上正确输出的行数。完美 20。

【讨论】:

  • 人们可能会指定一个“最后一个/空数组元素”规范,例如{ NULL , NULL, NULL, -1 }
  • Err... 我不得不承认这纯粹是一个粗心的错误。顺便说一句,你能告诉我为什么用 cin >> ch 替换 (cin >> ch).get() 根本没有效果吗?如果我使用 cin >> ch;并键入一个字符和一个换行符,换行符不是缓冲并在下一个 cin >> ch; 中读取吗?
【解决方案2】:

看起来您的迭代超出了数组的范围。为什么要迭代到 20(MAX)?看起来你应该迭代到 5,而不是。

此外,您应该在问题中包含您的预期输出。

【讨论】:

  • 这真是一个粗心的错误。谢谢!
猜你喜欢
  • 2011-09-20
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多