1 / 7
Apr 2017

Witam !
Czy mógłby ktoś powiedzieć dlaczego mój kod jest odrzucany przez sędziego ?

include iostream

include string

using namespace std;

string napis,zaszyfrowany;

int main()
{
//cout << "Podaj wiadomosc do zaszyfrowania: " << endl;
getline(cin, napis);

//scanf("%s", napis);


for(int i=0; i<napis.length(); i++)
{

    if(napis[i]!=32)napis[i]=napis[i]+3;
    if(napis[i]>90)
    {
        napis[i]-=26;
    }
    zaszyfrowany=zaszyfrowany+napis[i];

}

cout<<zaszyfrowany<<endl;



return 0;

}

Tam w include nie ma spacji, jest tam tylko dlatego aby przeszło przez edytor

  • created

    Apr '17
  • last reply

    May '17
  • 6

    replies

  • 716

    views

  • 5

    users

Po pierwsze kody dajemy w tagu dostępnym przez ctrl + shift + c albo linkujemy do ideone.
po drugie twój program szyfruje tylko jedną linię, potem kończy pracę. A tych linii może być dużo. zamiast getline(cin, napis); Daj while (getline(cin, napis)) dodaj stosowne klamry oraz "wyzeruj" zaszyfrowany po wypisaniu i usuń kod z forum bo mi po tych zmianach zaliczyło twój kod

Dzięki za pomoc. Będę pamiętał o uwagach względem wstawiania kodu. Był to mój pierwszy post

12 days later

hej,

przy wrzuceniu takiego rozwiązania dla sędziego wyrzuca mi błąd ze Segmentation fault, w testowaniu w konsoli przy większej ilości danych mam komunikat błędu 0xC0000005 co według Wikipedii znaczy to samo. Wiem mniej więcej co to znaczy ale nie wiem gdzie w moim programie próbuje naruszyć nie moją pamięć.

Dodam też ze udało mi się rozwiązać ten problem poprzez usunięcie drugiego stringa tekst2; i zastąpieniu go char text2; i podmianie w warunkach.

Aczkolwiek może byłby ktoś na tyle uprzejmy i powiedział dlaczego tak się działo ?

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string tekst[100];
    string tekst2[100];
    int index=0;
    while (getline(cin,tekst[index]))
    {
        index++;
    }
    for(int i=0; i<index; i++)
    {
        for(int j=0; j<tekst[i].size(); j++)
        {
            if (((int)tekst[i][j]!=32)&&((int)tekst[i][j])<88)
            {
                tekst2[i][j]=(int)(tekst[i][j]+3);
                cout<<tekst2[i][j];
            }
            else if ((int)tekst[i][j]==32)
            {
                tekst2[i][j]=(int)(tekst[i][j]);
                cout<<tekst2[i][j];
            }
            else
            {
                tekst2[i][j]=(int)(tekst[i][j]-23);
                cout<<tekst2[i][j];
            }
        }
        cout<<endl;
    }

    return 0;
}

Zastosowałeś zapis niedopuszczalny dla stringów, które są puste. Zastanów się dlaczego nie działa taki kod:
string test;
cout << test << ":" << endl;
test[0] = 'a';
cout << test << ":" << endl;
test[1] = 'b';
cout << test << ":" << endl;
test[10000] = 'c';
cout << test << ":" << endl;

Niestety dalej nie bardzo rozumiem.

Przy kompilacji twojego kodu program wypisuje wyłącznie ";" a nie wypisuje a i b które wstawiłeś pod index 0 i 1.

Jak usunę "test[10000] = 'c';" to program nie wyrzuca błędu.

Wiem ze tablica na początku jest pusta ale dlaczego błąd pamięci występuje w takim razie tylko przy ostatnim przypisaniu wartości ?

Używanie operatora [] przy zmiennej string z parametrem większym niż zwracanym przez fukcje length() dla tego stringa jest działaniem niezdefiniowanym , które powoduje takie błędy jakich doświadczasz.

W praktyce drobne przekroczenie rozmiaru nie powoduje błędu, błąd jest zwracany dopiero gdy program dostrzega, że sięgasz poza pamięć dla niego zaalokowaną.

Innymi słowy zanim odwołasz się do konkretnego znaku w zmiennej typu string, która jest elementem tablicy text2, za pomocą [], powinieneś użyć funkcji resize, aby zaalokować pamięć na dane, które tam chcesz zapisać. String sam z siebie tego nie zrobi.