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

Jak działa char* ?

Object Storage Arubacloud
+1 głos
6,531 wizyt
pytanie zadane 31 stycznia 2017 w C i C++ przez robRoy Użytkownik (970 p.)
Mój wykładowca zakazuje używania stringa, zamiast tego mamy stosować char* cosTam (najczęściej wewnątrz klasy). Przyznam że nie do końca rozumiem sposób użycia tej konstrukcji. Czy ktoś mógłby łopatologicznie mi ją wyjaśnić a w szczególności:

- jest to wskaźnik czyli trzeba gdzieś zaalokować pamięć (jak to zrobić?) (czy w klasie inaczej się to robi?)

-jak zarezerwować tylko tyle miejsca ile wymaga wyraz?

-jak wstawić wyraz/zdanie z poziomu kodu?

-jak używać tego wskaźnika gdy chcę wyświetlić wyraz czy go modyfikować?

-jak chcę umieścić ten tekst w funkcji lub zmienić go na strinag to wystarczy że napiszę wskaźnik w nawiasie ? String (cosTam) lub void funkcja (char* cosTam)? Bo coś mi to nie działa.

Bardzo bym też prosił o jakieś krótkie przykłady.
komentarz 31 stycznia 2017 przez mrcnsct Nałogowiec (36,390 p.)
1
komentarz 31 stycznia 2017 przez Bartłomiej Łaski Mądrala (5,100 p.)
To mnie rozwala :D, poczytaj sobie...

On przyszedl po pomoc bo to samo może sobie w google wyszukac i pewnie to wyszukal...

Pozdrawiam :)
komentarz 31 stycznia 2017 przez mrcnsct Nałogowiec (36,390 p.)
edycja 31 stycznia 2017 przez mrcnsct
Kiedyś się z tego uczyłem i uważam, że jest tam dobrze wyjaśnione. Mówisz, że pewnie to wyszukał. Może i tak, ale są i tacy, co zadają pytania bez szukania w google, dlatego dałem link.

2 odpowiedzi

+4 głosów
odpowiedź 31 stycznia 2017 przez Bartłomiej Łaski Mądrala (5,100 p.)
wybrane 31 stycznia 2017 przez robRoy
 
Najlepsza

Witaj 

Jest to wskaznik do tablicy znakow.

 

- jest to wskaźnik czyli trzeba gdzieś zaalokować pamięć (jak to zrobić?) (czy w klasie inaczej się to robi?) 

 Tak wyglada deklaracja classy i kontruktora

//plik naglówkowy
class Sportowiec{
private:
    char *nazwiko;
    char *sport;
    double waga;
public:
    Sportowiec(const char*, const char*, const double);
    ~Sportowiec();
    friend ostream& operator<< (ostream&, const Sportowiec&);
};
//deklaracja
#include <iostream>
#include <cstring>

using namespace std;

Sportowiec::Sportowiec(const char* nazwisko, const char* sport, const double waga)
{
    // rozmiar jest deklarowany poprzez funckje strlen ktora zwaca dlugosc slowa- zdania i musisz dodac +1 to jest znak konca
    this -> nazwiko= new char[strlen(nazwisko)+1];
    //tutaj kopujemy caly slowo do komorki w klasie nazwisko, z zmiennej nazwisko
    strcpy(this -> nazwiko, nazwisko);
    this -> sport= new char[strlen(sport)+1];
    strcpy(this -> sport, sport);
    this -> waga = waga;
}

Sportowiec::~Sportowiec()
{
    // deklaracja usuniecia tablicy, pozniewa char* to poprostu tablica znakow.
    delete []this -> nazwiko;
    delete []this -> sport;
}

ostream& operator<< (ostream& os, const Sportowiec& s)
{
    os << s.nazwiko << " " << s.sport << " "<< s.waga << "kg";
    return os;
}

jak wstawić wyraz/zdanie z poziomu kodu?

 Sportowiec s2("Malysz", "skoczek", 64); - można to tak zdeklarowac

Sportowiec* s3 = new Sportowiec("Malysz", "skoczek", 64); - tak tez mzona to jest dynamiczne alokowanie pamieci

 

-jak używać tego wskaźnika gdy chcę wyświetlić wyraz czy go modyfikować?

 Mozesz to zrobic poprzez przeciarzenie operatora<< , napisalem w kodzie jak to wyglada a wywolanie w mainie bedzie wygladalo to tak 
 

cout << s2 << endl;

 

-jak chcę umieścić ten tekst w funkcji lub zmienić go na strinag to wystarczy że napiszę wskaźnik w nawiasie ? String (cosTam) lub void funkcja (char* cosTam)? Bo coś mi to nie działa.

char* cos = new char[20] 
string blabla = cos; 

//powinno dzialac normlanie

 

Pozdrawiam 
Bartek :) 

ps. Byś chciał bym Ci to wytlimaczyl to powiedz, umiem to bardzo dobrze robic :). Moj gosciu od programowania wymagal tego ode mnie biegle :).

+2 głosów
odpowiedź 31 stycznia 2017 przez niezalogowany
edycja 31 stycznia 2017

- jest to wskaźnik czyli trzeba gdzieś zaalokować pamięć (jak to zrobić?) (czy w klasie inaczej się to robi?)

Musisz wiedzieć, że tekst w rzeczywistości jest adresem, zatem definicja:

const char* napis = "tekst";

Jest poprawna. To był zapis wskaźnikowy, zapisy tablicowe:

char str[12] = "Ala ma kota"; //11 znaków i znak null!
char str[] = "przyklad"; //niech kompilator sam sobie policzy
char str[] = {'w','y','r','a','z','\0'}; //tutaj też

-jak zarezerwować tylko tyle miejsca ile wymaga wyraz? 

Możesz wyraz wczytać do tablicy statycznej i przekopiować wyraz do tablicy dynamicznej o rozmiarze wyrazu.

-jak wstawić wyraz/zdanie z poziomu kodu?

 -jak używać tego wskaźnika gdy chcę wyświetlić wyraz czy go modyfikować?

char str2[10];
cin >> str2; //poprawnie, pod warunkiem, że str1 < 10
cout << str2 << endl;

str[2] = 'p'; //zamiana k na p

-jak chcę umieścić ten tekst w funkcji lub zmienić go na strinag to wystarczy że napiszę wskaźnik w nawiasie ? String (cosTam) lub void funkcja (char* cosTam)? Bo coś mi to nie działa.

#include <iostream>
#include <cstring>

using namespace std;

void compare_strings(char* s1, char s2[])
{
    if(strcmp(s1, s2) == 0)
        cout << "identyczne" << endl;
    else
        cout << "rozne" << endl;
}

int main()
{
    char str1[12] = "Ala ma kota";
    char str2[] = "Jurek ma psa";
    string str3 = str1; //rzutowanie niejawne

    compare_strings(str1, str2);

    return 0;
} 
komentarz 31 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
char* napis = "tekst";

Coś takiego nie powinno się skompilować

komentarz 31 stycznia 2017 przez niezalogowany
Dlaczego? Napis to wskaźnik typu char i przypisujemy do niego adres pod którym znajduje się ciąg znaków.
komentarz 31 stycznia 2017 przez unknown Nałogowiec (39,560 p.)

§D.4

The implicit conversion from const to non-const qualification for string literals (4.2) is deprecated.

Cytat ze standardu C++03. W C++11 nie ma nawet o tym wzmianki co znaczy, że jest to nie legalne. Powinno być:

const char* a{"jakiś tekst"};

 

komentarz 31 stycznia 2017 przez niezalogowany
Hm, w C++ faktycznie jest to nielegalne, wydaje mi się, że pomyliłem z C. Dzięki za odpowiedź już poprawiam! :P

Podobne pytania

0 głosów
1 odpowiedź 302 wizyt
pytanie zadane 19 stycznia 2021 w C i C++ przez Mytwi Nowicjusz (160 p.)
0 głosów
1 odpowiedź 823 wizyt
pytanie zadane 26 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
2 odpowiedzi 1,061 wizyt
pytanie zadane 24 stycznia 2017 w C i C++ przez spvce Początkujący (260 p.)

92,536 zapytań

141,376 odpowiedzi

319,449 komentarzy

61,920 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!

...