Forum » Programiranje » c++ vprašanje
c++ vprašanje
lisjak ::
nujno rabim pomoč...
zakaj dolžini besede in nove_besede nista enaki ?
če izpišem je prva 9 (kar je logično), druga pa 3 ?
pri drugem izpisu je beseda še vedno 9, nova_beseda pa 11
mi lahko kdo prosim razloži kak to gre ?
char beseda[]="tiskalnik"; char nova_beseda[strlen(beseda)]; char znak=' '; cout << strlen(nova_beseda) << " " << strlen(beseda); for (int i=0;i<(strlen(beseda));i++) nova_beseda[i]='_'; cout << strlen(nova_beseda) << " " << strlen(beseda);
zakaj dolžini besede in nove_besede nista enaki ?
če izpišem je prva 9 (kar je logično), druga pa 3 ?
pri drugem izpisu je beseda še vedno 9, nova_beseda pa 11
mi lahko kdo prosim razloži kak to gre ?
technolog ::
1. Preimenuj vprašanje v C, ker tole nima veze s C++ (razen cout).
2. Analogno - ker hočeš programirat v C, potem se nauči malo o reprezentaciji stringa, kaj pomeni, da je nekaj null-terminated...
3. Restartaj računalnik in dobil boš drugačne cifre.
2. Analogno - ker hočeš programirat v C, potem se nauči malo o reprezentaciji stringa, kaj pomeni, da je nekaj null-terminated...
3. Restartaj računalnik in dobil boš drugačne cifre.
lisjak ::
jaz bi rad, da je dolžina druge besede enaka dolžini prve ... kako bi to nardil ?
ps: učimo se c++, knjiga je c++, na predavanjih predava c++, nevem kaj je tu spornega
ps: učimo se c++, knjiga je c++, na predavanjih predava c++, nevem kaj je tu spornega
darkkk ::
uhhh... marsikaj:
1. če se greš c++ programiranje, pol nikoli (razen kjer nujno moraš) ne uporabljaš char* stringov, ampak knjižnico string.h (null terminated stringi so mala velika nočna mora)
2. zanimivo, da se ti koda sploh kompajla, ker načeloma bi jo moral char neki[definirano@runtime] usut. Ok, tle sicer ni definirano @runtime, samo ne se tega niti naučit, k je narobe na več nivojih.
3. če se že hočeš it sadomazo v c (jasno lahko rečeš temu tudi c++, samo poskrbi za
4. kje je bistvo tvoje napake, strlen na null terminated stringu (kar char * je) vrne število znakov od indeksa 0 do indeksa, kjer je zapisan znak s kodo 0 ('\0'). Torej dokler ne boš prepisal niza v novega oz. nastavil nov_niz[strlen(star_niz)] = '\0' in ostalih znakov na nekaj od '\0' razlicnega, strlen ne bo delal pravilno.
1. če se greš c++ programiranje, pol nikoli (razen kjer nujno moraš) ne uporabljaš char* stringov, ampak knjižnico string.h (null terminated stringi so mala velika nočna mora)
2. zanimivo, da se ti koda sploh kompajla, ker načeloma bi jo moral char neki[definirano@runtime] usut. Ok, tle sicer ni definirano @runtime, samo ne se tega niti naučit, k je narobe na več nivojih.
3. če se že hočeš it sadomazo v c (jasno lahko rečeš temu tudi c++, samo poskrbi za
#include<cstdlib>oz. če s c-jevim prevajalnikom delaš,
#include<stdlib.h>), pol narediš to kot:
char *nov_niz = malloc(sizeof(char) * (strlen(beseda)+1)); . . free(nov_niz); return 0;
4. kje je bistvo tvoje napake, strlen na null terminated stringu (kar char * je) vrne število znakov od indeksa 0 do indeksa, kjer je zapisan znak s kodo 0 ('\0'). Torej dokler ne boš prepisal niza v novega oz. nastavil nov_niz[strlen(star_niz)] = '\0' in ostalih znakov na nekaj od '\0' razlicnega, strlen ne bo delal pravilno.
Zgodovina sprememb…
- spremenil: darkkk ()
technolog ::
ps: učimo se c++, knjiga je c++, na predavanjih predava c++, nevem kaj je tu spornega
Je spornega. To je tako, kot bi jaz prodajal prenosni računalnik, v resnici pa bi potem, ko bi to kupil, ti dobil kalkulator. Sej C je tudi C++, ampak C++ je mnogo več kot C.
Je spornega. To je tako, kot bi jaz prodajal prenosni računalnik, v resnici pa bi potem, ko bi to kupil, ti dobil kalkulator. Sej C je tudi C++, ampak C++ je mnogo več kot C.
string beseda="tiskalnik"; string nova_beseda(beseda); cout << nova_beseda.size() << " " << beseda.size(); for (int i=0;i<beseda.size();i++) nova_beseda[i]='_'; cout << nova_beseda.size() << " " << beseda.size();
Zgodovina sprememb…
- spremenil: technolog ()
lisjak ::
darkkk
nočem se it sadomazo v c :) ampak takšna je pač snov... imamo strukturirano programiranje v c++ in do dinamičnih spremenljivk še niti nismo prišli. Rad bi nardil igro vislice... pa postopoma gradim program...
zdaj pač problem je, da niza nista enako dolga ...
naslednji problem pa bo kako generirati več besed...
ps: hvala vsem za odgovore :) čeprav se vam zdi primitivno...
nočem se it sadomazo v c :) ampak takšna je pač snov... imamo strukturirano programiranje v c++ in do dinamičnih spremenljivk še niti nismo prišli. Rad bi nardil igro vislice... pa postopoma gradim program...
#include <iostream> #include <time.h> #include <stdlib.h> #include <conio.h> // getch #include <cstdlib> // atoi #include <windows.h> // gotoxy using namespace std; int main() { char beseda[]="tiskalnik"; char nova_beseda[strlen(beseda)]; char znak=' '; cout << strlen(nova_beseda) << " " << strlen(beseda); for (int i=0;i<(strlen(beseda));i++) nova_beseda[i]='_'; cout << strlen(nova_beseda) << " " << strlen(beseda); system("pause"); while ((znak!=27) || (strcmp(beseda,nova_beseda)==0)) { system("cls"); for (int i=0;i<(strlen(beseda));i++) { if (znak==beseda[i]) nova_beseda[i]=znak; } for (int i=0;i<(strlen(nova_beseda)-1);i++) cout << " " << nova_beseda[i]; cout << endl <<"Vnesi crko: "; cout << endl << strlen(beseda) << " " << strlen(nova_beseda); putch(znak); znak=getch(); putch(znak); } system("pause"); return 0; }
zdaj pač problem je, da niza nista enako dolga ...
naslednji problem pa bo kako generirati več besed...
ps: hvala vsem za odgovore :) čeprav se vam zdi primitivno...
lisjak ::
ok, po nasvetu technologa, sem uporabil string ... dolžina je zdaj v redu ... ampak še vedno ne skoči ven, ko sta besedi enaki ... :/
#include <iostream> #include <time.h> #include <stdlib.h> #include <conio.h> // getch #include <cstdlib> // atoi #include <windows.h> // gotoxy using namespace std; int main() { string beseda="tiskalnik"; string nova_beseda(beseda); char znak=' '; // cout << strlen(nova_beseda) << " " << strlen(beseda); for (int i=0;i<(beseda.size());i++) nova_beseda[i]='_'; cout << nova_beseda.size() << " " << beseda.size(); system("pause"); while ((znak!=27) || (beseda.compare(nova_beseda)!=0)) { system("cls"); for (int i=0;i<(beseda.size());i++) { if (znak==beseda[i]) nova_beseda[i]=znak; } for (int i=0;i<(nova_beseda.size());i++) cout << " " << nova_beseda[i]; cout << endl <<"Vnesi crko: "; putch(znak); znak=getch(); putch(znak); cout << endl << beseda.size()<< ": "<<beseda << " " << nova_beseda.size()<< ": "<< nova_beseda << endl; } system("pause"); return 0; }
Zgodovina sprememb…
- spremenil: lisjak ()
darkkk ::
Lej ne da se mi desifirirat, oglej si tole:
Happy ?
#include <iostream> #include <string.h> using std::cout; using std::cin; using std::endl; using std::string; int main(){ string s1 = "tiskalnik"; string s2(s1.size(), '_'); //instanciras nov niz dolzine s1.size(), vsi znaki enaki '_' cout << s2; //izpises trenutno stanje "iskanega niza" char znak; while(s2.compare(s1) != 0){ //gres, dokler niza nista enaka cout << s2 << endl; //izpises trenutno znan niz cout << "Vnesi nov znak "; //plac za nov znak znak = cin.get(); //preberes en sam znak cin.ignore(1000, '\n'); //vrzes stran ostanek bufferja //(brez tega lahko koncas vislice v enem koraku) for(int i = 0; i < s1.size(); i++) if(s1[i] == znak) s2[i] = znak; //popravis znake v iskanem nizu } cout << endl << s2 << endl; cin.get() return 0; }
Happy ?
Zgodovina sprememb…
- spremenil: darkkk ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [JAVA] String problem!Oddelek: Programiranje | 1661 (1358) | Sergio |
» | C osnovaOddelek: Programiranje | 1539 (1054) | RunoTheDog |
» | [C++] Kopiranje char arraya v drug char arrayOddelek: Programiranje | 1264 (1135) | win64 |
» | Java-Izdelek-NujnoOddelek: Programiranje | 1498 (1270) | iggy |
» | [C/C++] pointerji in referenceOddelek: Programiranje | 2009 (1833) | Matako |