C++ pole ukazatelov na char retazce

Programovacie jazyky, rady, poradňa...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

C++ pole ukazatelov na char retazce

Príspevok od používateľa reDo »

mam pole ukazatelov na char teda na retazce

Kód: Vybrať všetko

char * pole=new char[5];
a teraz tam mozem a chcem nacitat pet retazcov do kazedo pointera jeden
ale nwm lebo ked tam takyto kod

Kód: Vybrať všetko

cin>>pole[0];
cin>>pole[1];
tak mi to nacita zank a dalsi znak a nie retazec
ako to mam sparvit aby mi to nacitalo 5 retazcov namiesto 5 znakov?? pls poradte :roll:
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Príspevok od používateľa bart11 »

Nejako takto (dynamicky)

Kód: Vybrať všetko

int retazcov = 5;
int dlzkaRetazca = 250; // jeden reťazec max. znakov
char ** pole = new char *[retazcov]; 
for(int i = 0; i < retazcov; i++) 
    pole[i] = new char [dlzkaRetazca]; 
načítanie:

Kód: Vybrať všetko

   cin >> pole[index];
vypísanie:

Kód: Vybrať všetko

   cout << pole[index]; // celý reťazec
   cout << pole[index][znak]; // znak v reťazci
gugl: (Dynamic) multidimensional char arrays c++
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

a take ako som chcel ja sa neda??? :o
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Príspevok od používateľa bart11 »

reDo napísal:a take ako som chcel ja sa neda??? :o
Veď si chcel načítať 5 reťazcov, namiesto 5-tich znakov! Buď som ťa vôbec nepochopil alebo sám nevieš čo chceš.

Zhrniem to:
To, čo si napísal ty

Kód: Vybrať všetko

char *pole = new char[5];
vytvorí v pamäti miesto pre 5 znakov.
To "moje"

Kód: Vybrať všetko

int retazcov = 5;
int dlzkaRetazca = 250; // jeden reťazec max. znakov
char ** pole = new char *[retazcov]; // smerník na pole smerníkov typu char(pointrov, ukazateľov)
for(int i = 0; i < retazcov; i++)
    pole[i] = new char [dlzkaRetazca]; 
vytvorí dvojrozmerné pole, môžeš si to predstaviť ako riadky (reťazce) a stĺpce (dĺžka reťazca = počet znakov v reťazci; jeden stĺpec = jeden znak).
Takže cin >> pole[0]; uložíš do prvého (nultého) riadku jeden reťazec, (skontroluj si dĺžku, pozor na pretečenie!!!)
a bla bla bla... už sa mi to nechce rozpisovať. Naštuduj si smerníky, polia, ...

Inak prečo nechceš použiť triedu string, ktorú c++ ponúka?
Zadáš len

Kód: Vybrať všetko

string retazce[5];
a fičíš.
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

viem ale v zadaní je pole ukazatelov na char

//autoeditácia príspevku ( 28 Jun 2009, 17:47 )
pozri ked nebudes nacitavat ale budes iba poriradzovat tak sa to da takto

Kód: Vybrať všetko

char * pole[5];
pole[0]="AHOJ";
pole[1]="CAW";
pole[2]="Hoj";
atd.
ale neda sa to nacitavat z cin ani odinakadial pretoze to neni alokovane a neco taketo by som chcel s tym alokovanym bez toho dvojrozmerneho
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Príspevok od používateľa bart11 »

reDo napísal:...
//autoeditácia príspevku ( 28 Jun 2009, 17:47 )
pozri ked nebudes nacitavat ale budes iba poriradzovat tak sa to da takto

Kód: Vybrať všetko

char * pole[5];
pole[0]="AHOJ";
pole[1]="CAW";
pole[2]="Hoj";
atd.
...
Veď to je dvojrozmerné pole.
Ak sa nemýlim (ak hej, tak ma niekto opravte), tak to znamená

Kód: Vybrať všetko

char *pole[5]; // je to isté ako: char **pole = new char*[5];
pole[0] = new char[5];
strcpy(pole[0], "AHOJ\0");

pole[1] = new char[4];
strcpy(pole[1], "CAW\0");
...
Takže to je to isté, čo som ti dal ja.
Vyskúšaj si to.
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

to nie je to isté tvoje je dvojrozmerné a moje jednorozmerné
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Nie je to to iste.

Kód: Vybrať všetko

char * pole[5]; 
pole[0]="AHOJ"; 
pole[1]="CAW"; 
pole[2]="Hoj"; 
atd.
pole je jednorozmerne pole, kde kazdy pointer ukazuje na konstantny retazec. Rozdiel medzi tymto a tvojim je ten, ze kazdy retazec je ulozeny niekde v datovom segmente v pamati medzi ostatnym konstantami, pricom v druhom pripade je v dynamickom segmente(heap). Samotny vyraz "AHOJ" je typu (char *), je to teda adresa znaku 'A' v datovom segmente - mozes ju preto priradit pointru, nie je to vsak odporucane, ale radsej alokovat pamat v heape a tam ich prekopirovat, kedze to moze niekedy sposobit komplikacie...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

no skusim to nejako sparvit ten program a hotovo :) :)

//autoeditácia príspevku ( 05 Jul 2009, 17:14 )
teraz sa ucim sablony a take podobne ako pretazovanie a ine a mam zadanie napiste sablonu fonkcie ktora prebera ako jeden parameter pole a druhy pocet prvkov a mala by vracat najvecsi prvok pola otestujte ho v programe s polom 6 hodnot typu double a 5 typu int a mala by tam byt aj explicitna specializacia pre pole ukazatelov na char a pocet prvkov toho pola ako druhy parameter zas a vracia najdlhsii retazec ak je iuch viac tak prvy no vecsinu som pochopil aj vedel ale nejde mi program tak ako b mal a mam tam chyby ktorym nerozumiem tu na je to co som zatial dokazal urobit ale nefunguje to

Kód: Vybrať všetko

#include <iostream>
#include <cstring>
#include <string.h>
using namespace std;
template <class T>
T max(T pole[], int pocet);

template <> char * max<char, int>(char * pole[], int pocet);

int main()
{
    char * pole[3];
    pole[0]="Adamko";
    pole[1]="MATUSKOJEwow2";
    pole[2]="MATUSKOJEwow1";
    char * pom=max(pole, 3);
    cout<<pom<<endl;
    double poledou[5]={1, 2, 3, 4, 5};
    
    double pomdo=max(poledou, 5);
    cout<<pomdo<<endl;
    system("pause");
    return 0;
}
template <class T>
T max(T pole[], int pocet)
{
        int i=0;
        T max=pole[i];
        for(;i<pocet;i++)
                if(max<pole[i]) {
                max=pole[i];   }
return max;
}
template <> char * max<char, int>(char * pole[], int pocet){
         int * pompole= new int[pocet];
         int x=0;
         int pommax=strlen(pole[0]);
         char * pom=NULL;
         for(int i=0;i<pocet;i++){
                 pompole[i]=strlen(pole[i]);
                
                 if(pommax<pompole[i]){
                 pommax=pompole[i];
                 x=i; } }
                  
                  pom=pole[x];
                  return pom;
}
a ako sa da urobit specializacia na viac typov a tak?? :roll: :cry: :roll:

//autoeditácia príspevku ( 05 Jul 2009, 17:35 )
pomozte pls
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Kód: Vybrať všetko

#include <iostream>
#include <cstring>
#include <string>

using namespace std;

template <typename T>
T maxn(T p[], int n)
{
    T MAX = 0;

    for (int i = 0; i < n; MAX = max(MAX, p[i]), ++i); //prechadzame kazdym prvkom pola a porovnavame ho s doposial najvacsim prvkom, ak je aktualny prvok vacsi, oznacime ho za najvacsi
    return MAX;
}

template <> char * maxn(char *p[], int n)
{
    char * MAX = NULL;
    unsigned int max_length = 0;

    for (int i = 0; i < n; ++i) {  //prechadzame postupne vsetky retazce
        if (strlen(p[i]) > max_length) { //porovname s doposial najvacsou dlzkou
            max_length = strlen(p[i]); //ak je retazec dlhsi, oznacime ho za najdlhsi
            MAX = p[i];
        }
    }

    return MAX;
}

int main(void)
{
    double p_d[6] = {3.141, 2.718, 1.618, 0.567, 1.414, 0.660};
    int p_i[5] = {0, 1, 42, 47, -1};
    char * p_c[5] = {"string", "c++", "011235813", "47", "lol"};

    cout << "Najvacsie cislo typu double: " << maxn(p_d, 6) << endl;
    cout << "Najvacsie cislo typu int: " << maxn(p_i, 5) << endl;
    cout << "Najdlhsi retazec: " << maxn(p_c, 5) << endl;

    return 0;
}

Ako myslis specialuzaciu na viac typov? Ak chces napr. specializaciu na typ int, tak vsade v sablone zmenis T na int...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

jj specializaciu na viac typov :)

//autoeditácia príspevku ( 06 Jul 2009, 7:56 )
vysvetli mi niekdo asko spravit specializaciu na viac typov??
Napísať odpoveď