» »

c++ vprašanje

c++ vprašanje

lisjak ::

nujno rabim pomoč...
    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.

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

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
#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.

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…

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...
#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:
#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 ()

technolog ::

system("pause");


;((


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] String problem!

Oddelek: Programiranje
151636 (1333) Sergio
»

C osnova

Oddelek: Programiranje
221526 (1041) RunoTheDog
»

[C++] Kopiranje char arraya v drug char array

Oddelek: Programiranje
71249 (1120) win64
»

Java-Izdelek-Nujno

Oddelek: Programiranje
71491 (1263) iggy
»

[C/C++] pointerji in reference

Oddelek: Programiranje
111996 (1820) Matako

Več podobnih tem