• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ wskaźnik na char

Object Storage Arubacloud
0 głosów
2,401 wizyt
pytanie zadane 2 sierpnia 2016 w C i C++ przez Ditrix Mądrala (5,650 p.)

Witam!

Mój problem, Gdy chce zrobić taką operację

char* word;
cin >> *word;
cout << *word;

Po wpisaniu słowa w konsoli wywala mi błąd. Nie chce korzystać z tablicy statycznej, a dynamicznej, do której potem zaalokuje ilość pamięci względem wpisanego słowa.

Jak to rozwiązać ? :D

2 odpowiedzi

0 głosów
odpowiedź 2 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
 
Najlepsza

Powodem błędu jest próba przypisania jakiejś wartości do nieustawionego wcześniej wskaźnika. Wskaźnik [word] wskazuje na losowe miejsce w pamięci.. musisz mu przypisać jakiś konkretny adres.. inaczej kompilator tego nie przepuści. Jeżeli by to zostawił tak jak jest, to istniała by szansa, że zmieniłbyś jakąś wartość (np. systemową) gdzieś w pamięci. Aby to działało, musisz wcześniej utworzyć zmienną typu char, a następnie przypisać jej adres do wskaźnika.

char word;
char* p_word=&word;
std::cin >> *p_word;
std::cout << *p_word;

 

komentarz 2 sierpnia 2016 przez Ditrix Mądrala (5,650 p.)

To jeszcze jedno pytanie jak można ^^

Jak wpisze np. słowa 'Ola', po wyświetleniu zmiennej *p_word wyświetla mi się oczywiście 'O', a do wyboru kolejnej litery jakiej powinienem użyć instrukcji  ?

Wiem, że wcześniej robiłem coś podobnego do

(p_word + 1)
// lub
(*p_word + 1)

Niestety to nie działa, więc jak dobrze to wykonać ?

komentarz 2 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Zapis bez gwiazdki dla wskaźnika oznacza, że masz do czynienia z adresem, natomiast gwiazdka umożliwia otrzymanie wartości, na którą wskaźnik pokazuje. Idąc tym tokiem rozumowania:
(p_word +1) //Adres następnego elementu
(*p_word +1) //Wartość na którą pokazuje wskaźnik p_word zwiększona o jeden.. jeżeli p_word pokazuje na 'O' to ten nawias zwróci ci znak o jeden dalej (w tablicy Ascii), czyli 'P'.
*(p_word +1)
//W tym przypadku otrzymasz wartość z adresu jaki znajduje się w nawiasie. 
Dodam jeszcze, że instrukcja cout ma wbudowany specjalny "mechanizm" umożliwiający wypisywanie całej tablicy znaków (char lub const char) podając adres tylko jednego elementu. Jak to działa?
Weźmy pod przykład prostą tablicę:
char* Text="Prosty tekst";
W pamięci tak na prawdę stworzy się taka tablica:
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12 |
Znak  |'P'|'r'|'o'|'s'|'t'|'y'|' '|'t'|'e'|'k'|'s'|'t'|'\0'|

Gdzie ostatni znak oznacza koniec tekstu.
Teraz jeżeli w cout'cie wypiszemy adres tylko np. elementu 5 (litera 't') to na ekranie pojawi się:
ty tekst
Dzieje się tak dlatego, gdyż cout wypisuje wszystkie kolejne znaki, aż napotka znak '\0'.

komentarz 2 sierpnia 2016 przez Ditrix Mądrala (5,650 p.)

Dobra zrobiłem taki kod, zdaję mi się, że według Twoich wskazówek, ale nadal nie działa. Popraw mnie jak gdzieś mam błąd.

    char word;
    char* P_word = &word;

    cin >> *P_word;

    cout << *P_word << endl;
    *(P_word++);
    cout << *P_word << endl;

 

komentarz 2 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Jeżeli chcesz przesunąć wskaźnik o jedną komórkę do przodu wystarczy, że zapiszesz tylko:
P_word++;
Nie musisz zamykać tego w nawias, ani dodawać gwiazdki. Poza tym..przesuwanie wskaźnika stosuje się przede wszystkim, gdy mamy do czynienia z tablicą.. ponieważ wtedy adresy są ułożone obok siebie i tego typu manewr będzie miał sens. W innym przypadku, jeżeli np. wskaźnik pokazuje na pojedynczy element przesunięcie go o jedną komórkę nie daje gwarancji, że wskaźnik będzie wskazywał na to co byś chciał. Innymi słowy zamień:
char word;
na np.
char word[10];

komentarz 2 sierpnia 2016 przez Ditrix Mądrala (5,650 p.)
Hmm bo wiesz chce zrobić coś podobnego jak w przypadku vectora.

No wiec wyjaśnię bardziej.

Zerowy element tablicy char wskazuję całe słowo, pierwszy element wskazuje całe słowo oprócz pierwszej litery.

A mi chodzi o to, żebym przewijał litery w danym słowie. Np, że wskaźnik p_word jest obecnie na literze "T", a po przesunięcie wskazuję już na literę "e" i tak dalej.

W moim głównym zamyśle jest, aby użytkownik podał jakieś słowo, a przez pętla while oblicze ile jest liter w tym słowie, i zrobię tablicę tyle elementową.
komentarz 2 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
Nie możesz przesuwać wskaźnika ot tak sobie.. jeżeli go przesuniesz to będzie on pokazywał na coś zupełnie innego.. właśnie dlatego należy najpierw "przygotować" miejsce po którym będziesz się "przemieszczał" przy pomocy wskaźnika. Poza tym przydzielanie pamięci, czy deklarowanie tablicy to nie są jakieś kosztowne operacje, ani pod względem czasowym, ani pamięciowym. No chyba, że wykonujesz tego typu operacje setki razy, czego nie musisz robić.. bo wystarczy, że stworzysz jeden tzw. bufor, czyli dużą tablicę (np. 255 elementową), do której cały czas będziesz wprowadzał dane z wejścia.. a po takiej tablicy już się przemieszczać możesz. Ale mimo wszystko.. nie rozumiem dlaczego próbujesz się bawić w tego typu kombinacje.. skoro możesz użyć najzwyklejszego stringa.
komentarz 2 sierpnia 2016 przez Ditrix Mądrala (5,650 p.)
Chce zrobić najkrótszą względem kodu grę w wisielca. Każda litera jest mi potrzebna osobno. Zdaję sobie sprawę, że dynamicznie zaalokowane komórki pamięci są umieszczone w różnym miejscach na dysku twardym, ale liczyłem, że takie coś da się osiągnąć, patrząc na np listę, w której nowe elementy mogą być dodawane w "nieskończoność" i można za pomocą iteratora przechodzić do kolejnych elementów tej tablicy.
+1 głos
odpowiedź 2 sierpnia 2016 przez maly Nałogowiec (37,190 p.)

do której potem zaalokuje ilość pamięci względem wpisanego słowa.

Najpierw musisz zalokować a dopiero potem możesz coś tam wpisać.

cin >> word;
cout << word;

 

Podobne pytania

0 głosów
0 odpowiedzi 304 wizyt
pytanie zadane 1 lipca 2019 w C i C++ przez aram100 Użytkownik (500 p.)
0 głosów
4 odpowiedzi 4,467 wizyt
pytanie zadane 4 kwietnia 2016 w C i C++ przez esp0x309 Użytkownik (510 p.)
0 głosów
2 odpowiedzi 1,081 wizyt
pytanie zadane 5 stycznia 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...