PROBLEM c++(program przestaje działać)

0

WItam mam problem z programem, ma on wczytywac z ekranu data urodzenai uzytkownika a nastepnie w odpowiedzi podac odpowiedni znak zodiaku. Kompilator nie wychwyca mi błędów natomiast program po wpisaniu daty samoczynnie przestaje działać...

#include <iostream>
#include <cstdio>

#include <cstring>

using namespace std;
int i;
int d_ur;
char* m_ur;

struct zodiak //definiuje strukturę danych o znakach zodiaku
  {
    int dzien;
    char mies[13];
    char znak[11];  
    }; 

    zodiak data[12] = 
{
    23, "grudnia",       "koziorozca",
    20, "stycznia",      "wodnika",
    20, "lutego",        "ryb", /* od 20 lutego do 20 marca */
    21, "marca",         "barana",
    20, "kwietnia",      "byka",
    21, "maja",          "blizniet",
    21, "czerwca",       "raka",
    22, "lipca",         "lwa",
    23, "sierpnia",      "panny",
    23, "wrzesnia",      "wagi",
    23, "pazdziernika",  "skorpiona",
    22, "listopada",     "strzelca"
};

string porownaj()
    {
    while(strcmp(data[i].mies, m_ur) && i++ < 11){}
        if(i<12)
            {
                cout<<"TWOIM ZNAKIEM JEST ";
                if(d_ur >= data[i].dzien) i = (i+1)%12;
                cin>>data[i].znak; 
            }
        else
            cout<<"$$$ ZLE WPISALES MIESIAC $$$";            

        return 0;
    }

    int main()
    {
        cout <<"podaj dzien urodzenia: ";
        cin>>d_ur;
        cout<<"podaj miesiac urodzenia (np. marca): ";
        cin>>m_ur;
        porownaj();
        return 0;
    } 
0

Dlaczego używasz zmiennych globalnych? Dlaczego funkcja porownaj zwraca string a jest return 0;? Dlaczego do wskaźnika próbujesz wczytać napis? Dlaczego do obsługi napisów nie użyjesz std::string?

Najważniejszym błędem jest ten ostatni - nie można tak wczytać tekstu. Albo użyj zmiennej typu std::string albo statycznego bufora czyli char[MAX_ZNAKOW] ale to wymaga dodatkowych zabezpieczeń.

Np.

  std::string napis;

  std::cin >> napis;

http://ideone.com/rfkEGZ

0

Sprawdź najpierw na co wskazuje m_ur, bo z kodu wynika że wskazuje ono na jakieś puste miejsce w <s>przestrzeni</s> pamięci.
Poza tym zmienne globalne są złe :/ nie lepiej zadeklarować te zmienne w funkcji main i przekazać je jako parametr do funkcji porownaj?

edit
Wyprzedziłeś mnie o 8 sekund :/

0

moj wykładowca obcina mi punkty o polowe jeżeli nie deklaruje jak największej ilości zmiennych jako globalne , a uwagi zaraz uwzględnie ;)

0

std::cout<<"podaj miesiac urodzenia (np. marca)";
std::cin >> m_ur;
zmieniłem tak jak radziłeś Endrju lecz nie poskutkowało i tak wyrzuca komunikat "program przestał działać" zaraz po tym jak wpisze miesiąc urodzenia;/

0

Ktoś ma pomysł dlaczego wyskakuje mi taki komunikat?

0
#include <iostream>
#include <cstdio>
#include <cstring>
#include<string>
#include<cstdlib> 

using namespace std;
int i;
int d_ur;
char* m_ur;

struct zodiak //definiuje strukturę danych o znakach zodiaku
  {
    int dzien;
    char mies[13];
    char znak[11];  
    }; 

    zodiak data[12] = 
{
    23, "grudnia",       "koziorozca",
    20, "stycznia",      "wodnika",
    20, "lutego",        "ryb", /* od 20 lutego do 20 marca */
    21, "marca",         "barana",
    20, "kwietnia",      "byka",
    21, "maja",          "blizniet",
    21, "czerwca",       "raka",
    22, "lipca",         "lwa",
    23, "sierpnia",      "panny",
    23, "wrzesnia",      "wagi",
    23, "pazdziernika",  "skorpiona",
    22, "listopada",     "strzelca"
};

string porownaj()
    {
    i=3;
    while(strcmp(data[i].mies, m_ur) && i++ < 12){}
        if(i<12)
            {
                cout<<"TWOIM ZNAKIEM JEST ";
                if(d_ur >= data[i].dzien) i = (i+1)%12;
                cin>>data[i].znak; 
            }
        else
            cout<<"$$$ ZLE WPISALES MIESIAC $$$";            

        system("pause")
    }

    int main()
    {

        cout <<"podaj dzien urodzenia: ";
        cin>>d_ur;
        std::cout<<"podaj miesiac urodzenia (np. marca)";
        std::cin >> m_ur;
        porownaj();
        return 0;
    }
0

już dostałeś odpowiedź ale czytasz niedokładnie.

na co wskazuję zmienna m_ur?

0
adek93 napisał(a):

nie rozumiem Ciętu masz rację.
Aby rozumieć trzeba jakieś podstawy łyknąć.

char m_ur[13];
...
cin >> setw(12) >> m_ur; // potrzebne <iomanip>

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0