Char i cin - wychodzenie poza zakres.

2012-12-30 21:52
0

Witam.
Nie rozumiem czemu po stworzeniu takiego kodu:

 #include <iostream>
using namespace std;

int main()
{
char tab[5];
cin>>tab;
cout<<tab[8];
return 0;
}

program mój się kompiluje i po wpisaniu wyrazu dłuższego niż 4 znaki i tak wyświetli 8 element, choć teoretycznie nie ma do niego dostępu.
Mój kompilator to g++.
Pozdrawiam

edytowany 1x, ostatnio: olesio, 2012-12-31 03:31

Pozostało 580 znaków

2012-12-30 22:02
2

Z tego powodu, że nie pilnujesz czy nie wychodzisz poza zakres tablicy.
Można to zrobić tak: cin >> setw(5) >> tab;. setw jest zdefiniowany w nagłówku iomanip.
Dlatego do wczytywania napisów lepiej używać std::string


edytowany 1x, ostatnio: byku_guzio, 2012-12-30 22:02
cin >> setw(4) >> tab; - _13th_Dragon 2012-12-30 22:03
nie chce mi się sprawdzać, ale wg. tego http://en.cppreference.com/w/cpp/io/manip/setw jednak 5 - byku_guzio 2012-12-30 22:06
A znak końca gdzie się zapisze? - _13th_Dragon 2012-12-30 22:09
Patrzyłeś tam na example? Sprawdziłem i ja mam rację(przynajmniej jeżeli chodzi o implementację w vs2k10). Przy setw(5) wczyta 4 znaki i w piątym będzie '\0' - byku_guzio 2012-12-30 22:12
Heh, racja, zawsze byłem przekonany że trzeba odejmować jeden znak. Plus ode mnie. Dzięki. - _13th_Dragon 2012-12-30 23:19

Pozostało 580 znaków

2012-12-30 22:03

Mażesz po pamięci, dokładniej po stosie, przy dłuższym wprowadzonym napisie będzie jakiś Access Violation i/lub zamazywanie innych zmiennych. C/C++ nie sprawdza zakresów.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2012-12-30 22:16
0

Dokładnie jak mówisz. Po wpisaniu iluś tam znaków występuje błąd segmentation fault. Dziękuje za wyjaśnienie.

Pozostało 580 znaków

2012-12-30 22:18
1

Sa ciekawsze sprawy, chociazby:

#include <iostream>
using namespace std;

int main() {
    char tab[5];
    char tab2[5];
    cin >> tab2;
    cout << tab << endl;
    return 0;
}

Wyswietla wszystkie wpisane znaki poza 5 pierwszymi :>
Co jednak nie jest poprawne nigdzie i nie nalezy tak robic.

Ale jak przeniesiesz tab'y jako zmienne globalne, to należy przestawić je miejscami dla osiągnięcia tego samego efektu. ;P - _13th_Dragon 2012-12-30 23:20
To tak. Jest jeszcze jeden dosc fajny triczek w cpp, a mianowicie a = (a + b) - (b = a) :> - n0name_l 2012-12-30 23:49
lepiej z xor'em: a=(a<sup>b)</sup>(b=a); bo nie lubię przepełnień :D - _13th_Dragon 2012-12-31 00:32

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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