在编译时获取未初始化的内存警告

时间:2019-06-21 19:54:33

标签: c++

我编写的代码具有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

1 个答案:

答案 0 :(得分:2)

您的代码中存在几个问题:

  • 如果用户输入1,则您会读取 char ,但您会在字符1之后得到返回的输入,以完成cin >> izbor;的输入(或在1之后输入的任何字符)
  • 如果用户输入2,则您使用未初始化的值执行p.k * p.c,则行为未定义
  • 即使在用户输入2的情况下,您也会执行循环while (izbor!= 3);,因为 izbor 的值为2,并且不能更改为值3,所以循环永远不会结束。
  • 请注意,还设置了 r 但从未使用过。

如果我了解您的希望,您想要的是类似的东西,即使仍然需要 string ,仍然仅对 proizvod 使用 char :< / p>

#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 >>是否成功,如果发生错误,我只是中止执行,但也可以刷新无效的输入以重做。