Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] 2 problemy ze stringiem i "wariowaniem programu"

Ostatnio zmodyfikowano 2012-10-21 10:15
Autor Wiadomość
marcin107
Temat założony przez niniejszego użytkownika
[C++] 2 problemy ze stringiem i "wariowaniem programu"
» 2012-10-19 23:20:02
Witam mam problem ze swoją "gierką" konsolową, konkretnie gdy chcę zmienić nazwę czegoś i w tej nazwie będzie spacja lub inny dziwny znak, to program wariuje, widać tylko jak program wraca do pierwotnej funkcji int main() i spamuje tekstem "Nie ma takiej opcji", która domyślnie jest w default przy switchu. Podobnie jest w przypadku innych zmiennych już nie mówię o nazwie, jak tylko przypiszę jakiś ukośnik do zmiennej, mój programik nadaję się tylko do restartu... Czy jest jakaś rada na to? Jeżeli potrzeba kodu lub więcej szczegółów, piszcie. 
P-67103
cyklopek11
» 2012-10-19 23:26:31
Bez listingu tylko jasnowidz może pomóc :-)
P-67104
Dragonit
» 2012-10-20 00:39:34
Pewnie, źle dobierasz typy zmiennych.
P-67108
marcin107
Temat założony przez niniejszego użytkownika
» 2012-10-20 09:59:31
C/C++
int main()
{
    srand( time( 0 ) );
    system( "CLS" );
    cout << "--> Plemiona <--\n";
    cout << "1. Zacznij gre\n";
    cout << "0. Wyjdz\n\n";
    cout << " -----------------------------------------------------\n";
    cout << " |  Autor gry: xxx                                   |\n";
    cout << " |  Wersja gry: done about 74% UNOFFICIAL ALPHA      |\n";
    cout << " -----------------------------------------------------\n";
    int choice = 0;
    cin >> choice;
    switch( choice )
    {
    case 1:
        {
            wioska();
            break;
        }
    case 0:
        {
            return 0;
            break;
        }
        default:
        {
            cout << "Nie ma takiej opcji\n";
            choice = 0;
            main();
        }
    }
   
    return 0;
}

int wioska()
{
    system( "CLS" );
   
    cout << "Witaj w " << townname << "\n";
    cout << "1. Wejdz do ratusza\n";
    cout << "2. Wejdz do koszar\n";
    cout << "3. Wejdz do gospody\n";
    cout << "4. Wejdz do magazynu\n";
    cout << "5. Wejdz do kuzni\n\n";
    cout << "---------------------\n";
    cout << "| 9. Nastepny dzien |\n";
    cout << "---------------------\n";
    cout << "\n0. Wyjdz z gry\n";
    int choice;
    cin >> choice;
    switch( choice )
    {
    case 1:
        {
            ratusz();
            break;
        }
    case 2:
        {
            if( buildinglvls[ koszarynum ] == 0 )
            {
                cout << "Nie wybudowano jeszcze tego budynku!\n";
                Sleep( 1500 );
                wioska();
            }
            else koszary();
           
            break;
        }
    case 3:
        {
            gospoda();
            break;
        }
    case 4:
        {
            magazyn();
            break;
        }
    case 5:
        {
            if( buildinglvls[ 5 ] == 0 )
            {
                cout << "Nie wybudowano jeszcze tego budynku!\n";
                Sleep( 1500 );
                wioska();
            }
            else kuznia();
           
            break;
        }
    case 9:
        {
            wieczor();
            break;
        }
    case 0: main();
        default:
        {
            brakopcji();
            wioska();
        }
    }
   
    return 0;
}

void ratusz()
{
    int choice;
    choice = 0;
    system( "CLS" );
    cout << "Ratusz:\n\n";
    cout << "1. Zmien nazwe miasta\n";
    cout << "2. Ulepszanie budynkow\n";
    cout << "3. Spis statystyk\n\n";
    cout << "8. Osiagniecia\n\n";
    cout << "\n0. Wyjdz z ratusza\n";
   
    cin >> choice;
    switch( choice )
    {
    case 1: namechange();
    case 2:
        {
            if( allowbuild != 0 )
                 buildingupgrades();
            else
            {
                cout << "Nie mozesz juz dzisiaj budowac!\n";
                Sleep( 1500 );
                ratusz();
            }
            break;
        }
    case 3: stats();
    case 8: osiagniecia();
    case 0: wioska();
        default:
        {
            brakopcji();
            choice = 0;
            ratusz();
            break;
        }
       
    }
}

void namechange()
{
    char name[ 15 ];
    system( "CLS" );
    cout << "UWAGA: Prosze nie dodawac spacji oraz specjalnych znakow w nazwie\n";
    cout << "Spowoduje to blad krytyczny!\n";
    cout << "Podaj nowa nazwe: \n";
    cin >> name;
    townname = name;
    cout << "Nazwa zmieniona!\n";
    Sleep( 500 );
    ratusz();
}

Oczywiście problem jest w namechange() o czym mówi komunikat "UWAGA...", jak się złamie zakaz, to program jakby do każdej zmiennej przypisuje coś co powoduje wyświetlnie się defaulta ze switcha w każdej z wyżej wymienionych procedur.

// ====
Wyżej na globalu mam dodaną string towname, pozostałe zmienne są int
P-67111
SeaMonster131
» 2012-10-20 10:57:33
Zamiast
C/C++
cin >> name;
daj
C/C++
getline( cin, name );
to wczyta Ci razem ze spacją.
P-67112
marcin107
Temat założony przez niniejszego użytkownika
» 2012-10-20 15:08:16
poprawiłem
C/C++
void namechange()
{
    system( "CLS" );
    cout << "UWAGA: Prosze nie dodawac spacji w nazwie\n";
    cout << "Spowoduje to blad krytyczny!\n";
    cout << "Podaj nowa nazwe: \n";
    getline( cin, townname );
    cout << "Nazwa zmieniona!\n";
    Sleep( 500 );
    ratusz();
}
Teraz nic nie mogę wpisać, tylko od razu cofa mnie do procedury, która jest wywoływana na końcu namechange()
P-67126
Mrovqa
» 2012-10-20 15:27:46
Teraz nic nie mogę wpisać, tylko od razu cofa mnie do procedury, która jest wywoływana na końcu namechange()
Tak, cofa do przodu...
Używasz wcześniej
cin >> var;
? Jeśli tak, to wpadłeś w popularną zasadzkę - przed isntrukcją:
C/C++
getline( cin, townname );
Wyczyść bufor cin, pierwszy znak to zapewne '\n' :)
P-67127
marcin107
Temat założony przez niniejszego użytkownika
» 2012-10-20 15:52:03
Nie doczytałem sorrki xd
Dodałem cin.sync(); przed pobraniem zmiennej i spacja oraz inne dziwne znaki działają.
Teraz tylko pozostaje kwestia, czy po przypisaniu wartości do zmiennej np: wartość " 4/ ", można jakoś tą zmienną wyczyścić żeby mi nie spamowało cały czas defaultem ze switcha? 
P-67128
« 1 » 2
  Strona 1 z 2 Następna strona