【问题标题】:Getting uninitialized memory warning at compilation在编译时收到未初始化的内存警告
【发布时间】:2019-11-04 16:08:24
【问题描述】:

我编写的代码有一个选项,其中用户输入一些数字和其他选项,将用户的两个数字相乘,所有这些数字都是在 2 种情况下生成的,但我出错了。我对编程完全陌生,只是为了清除。

struct proizvod
{
    char materijal;
    int k;  // kolicina
    int c; // cijena
};

int main()
{

    int izbor;
    cout << endl
        << " 1 - Unos podataka.\n"
        << " 2 - Rezultat.\n"
        << " 3 - Izlaz.\n"
        << " Unesi broj i pritisni enter: ";
    cin >> izbor;
    switch(izbor)
    {
        proizvod p;
        case 1:
            cout << "\nUnesite ime proizvoda: ";
            cin.get(p.materijal);
            cout << "\nUnesite kolicinu proizvoda: ";
            cin >> p.k;
            cout << "\nUnesite cijenu proizvoda: ";
            cin >> p.c;
            break;
        case 2:
            int r;
            r = p.k * p.c; // multiply

        while (izbor!= 3);
    }

    return 0;
}

编辑

错误 C2086 'int r':重新定义 ConsoleApplication1

【问题讨论】:

  • 这是一个警告而不是错误。 r = p.k * p.c; 如果您选择案例 2,那么您将乘以未初始化的变量。
  • 您应该学习编程基础知识:流程、循环等。这不是您的代码中可以修复的单个问题,整个流程是不正确的。
  • 如果用户输入 2,那么您执行“案例 2”并且您执行 p.k * p.cp 未初始化,因此行为未定义。 while (izbor!= 3); 也会循环 forrever 因为 izbor 值 2 并且不能变成 3
  • @oblivion 你在 while (izbor!= 3) 之前没有初始化过 izbor,行为是未定义的,并且你没有解决最初的问题
  • 非常感谢!我很感激 !! @oblivion

标签: c++


【解决方案1】:

你的代码有几个问题:

  • 如果用户输入 1,您会读取一个 char,但您将在字符 1 之后获得返回以完成 cin &gt;&gt; izbor; 的输入(或在 1 之后输入的任何字符)李>
  • 如果用户输入 2,您使用非初始化值执行 p.k * p.c,则行为未定义
  • 如果用户输入 2,您仍然会执行循环 while (izbor!= 3);,因为 izbor 值 2 并且无法更改为值 3,因此该循环永远不会结束。
  • 还要注意 r 已设置但从未使用过。

如果我理解你希望你想要这样的东西,仍然只为 proizvod 使用 char 甚至可能你想要一个 string :

#include <iostream>

using namespace std;

struct proizvod
{
    char materijal;
    int k;  // kolicina
    int c; // cijena
};

int main()
{
  proizvod p;
  bool pSet = false;

  for (;;) {
    cout << endl
         << " 1 - Unos podataka.\n"
         << " 2 - Rezultat.\n"
         << " 3 - Izlaz.\n"
         << " Unesi broj i pritisni enter: ";

    int izbor;

    if (!(cin >> izbor)) {
      cerr << "the choice is not an integer, abort" << endl;
      return -1;
    }

    switch (izbor) {
    case 1:
      cout << "\nUnesite ime proizvoda: ";
      if (!(cin >> p.materijal)) {
        cerr << "premature EOF" << endl;
        return -1;
      }
      cout << "\nUnesite kolicinu proizvoda: ";
      if (!(cin >> p.k)) {
        cerr << "quantity is not an integer, abort" << endl;
        return -1;
      }
      cout << "\nUnesite cijenu proizvoda: ";
      if (!(cin >> p.c)) {
        cerr << "price not an integer, abort" << endl;
        return -1;
      }
      pSet = true;
      break;
    case 2:
      if (!pSet)
        cerr << "you did not enter the price and quantity" << endl;
      else
        cout << "Rezultat : " << p.k * p.c << endl;
      break;
    case 3:
      return 0;
    default:
      cerr << "invalid choice" << endl;
    }
  }

  return 0; // cannot be reach
}

为了不冒险,我更喜欢用英语写新句子

编译和执行:

pi@raspberrypi:/tmp $ g++ -g -pedantic -Wextra -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out

 1 - Unos podataka.
 2 - Rezultat.
 3 - Izlaz.
 Unesi broj i pritisni enter: aze
the choice is not an integer, abort
pi@raspberrypi:/tmp $ ./a.out

 1 - Unos podataka.
 2 - Rezultat.
 3 - Izlaz.
 Unesi broj i pritisni enter: 4
invalid choice

 1 - Unos podataka.
 2 - Rezultat.
 3 - Izlaz.
 Unesi broj i pritisni enter: 2
you did not enter the price and quantity

 1 - Unos podataka.
 2 - Rezultat.
 3 - Izlaz.
 Unesi broj i pritisni enter: 1

Unesite ime proizvoda: a

Unesite kolicinu proizvoda: 2

Unesite cijenu proizvoda: 33

 1 - Unos podataka.
 2 - Rezultat.
 3 - Izlaz.
 Unesi broj i pritisni enter: 2
Rezultat : 66

 1 - Unos podataka.
 2 - Rezultat.
 3 - Izlaz.
 Unesi broj i pritisni enter: 3
pi@raspberrypi:/tmp $ 

如您所见,我还检查了cin &gt;&gt; 是否成功,如果出现错误,我只是中止执行,但也可以刷新无效输入以重做。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 2020-10-25
    • 1970-01-01
    • 2016-08-12
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多