Skocz do zawartości
kaczka

Łańcuchy Znaków W C++

Rekomendowane odpowiedzi

hey, mam problem. Jestem totalnym noobem w programowaniu i nie wiem jak skopiować łańcuch znaków ( wpisywany z klawiatury ) do tablicy znaków O_o i jaką funkcją można określić długość łańcucha? Używam iostream'a. Potrzebuje pomocy HELP

Edytowane przez kaczka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

o rany ale to są podstawy.

Aby skopiowac do jakiejś zmiennej coś z klawatury użyć możesz

cin>>zmienna;

jeżeli zmienna będzie typu int to po wpisaniu liczby znajdzie się tam ona. Jeżeli zmiennna była by typu np. char * to wtedy zapisze się do zmiennej wpiany tekst. Pamiętaj że zapisze się to tylko do pierwszej spacji. Jeżeli chcesz zapisywać jakiś dłuższy tekst to możesz użyć

cin.getline(zmienna,100);

gdzie 100 to liczba zapisywanych znaków do zmiennej.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

o rany ale to są podstawy.

Aby skopiowac do jakiejś zmiennej coś z klawatury użyć możesz

cin>>zmienna;

jeżeli zmienna będzie typu int to po wpisaniu liczby znajdzie się tam ona. Jeżeli zmiennna była by typu np. char *  to wtedy zapisze się do zmiennej wpiany tekst. Pamiętaj że zapisze się to tylko do pierwszej spacji. Jeżeli chcesz zapisywać jakiś dłuższy tekst to możesz użyć

cin.getline(zmienna,100);

gdzie 100 to liczba zapisywanych znaków do zmiennej.

1500441[/snapback]

totalny noob chyba mówi samo za siebie, że ucze sie dopiero.

 

cin >> zmienna nie łapie mi tego łańcucha, jak chce go później wypisać to mi chinskim odpisuje, a za cin.getline bardzo dziękuje :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak ci

cin>>zmienna;

nie działa :|

sprubuj taki kod wstawić

 

char *tekst;

cin>>tekst;

cout<<tekset;

1500863[/snapback]

jeden noob pomaga drugiemu. LOL.

 

Jak chcesz cokolwiek wprowadzić do zmiennej *tekst ? jak jest ona wskaźnikiem na zmienną typu CHAR. Jak nie zaalokujesz do niej pamięci to strzelasz w PAMIĘĆ, co może się katastrofalnie skończyć. Dlatego Ci krzaki wywalało przy odczycie. Pomyślcie następnym razem zanim odpiszecie, a nie mówicie kaczce, że to podstawy a sami tych podstaw nie znacie.

 

pozdro.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a moze tak?

 

#include <iostream>

#include <string>

using namespace std;

 

main()

{

string text;

cout << "wpisz jakis tekst: ";

cin >> text;

cout << "wynik: " << text << endl;

return 0;

}

 

poprawnie? :)

 

a jesli juz koniecznie upierasz sie przy tych wskaznikach to moze tak?

 

#include <iostream>

using namespace std;

 

main()

{

char text[100];

char *wsk;

cout << "wpisz jakis tekst: ";

gets(text);

wsk = new char[strlen(text)+1];

strcpy(wsk, text);

cout << "wynik: " << wsk << endl;

return 0;

}

 

w drugim przypadku mozesz pisac rowniez spacje

Edytowane przez jpr

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wielkie dzięki jpr, świetna odpowiedź :) Przy okazji poznałem nową funkcje - gets(text) :D

 

EDIT:

 

Ok natrafiłem na kolejny problem pisząc swój program. Napisalem funkcje porównującą element 1 tablicy z elementami 2 tablicy i mam wyróżnione 3 możliwości:

 

if(warunek1)

 

ble

 

return(cos1);

 

if(warunek2)

 

bla

 

return(cos2);

 

if(warunek3)

 

asdf

 

return(cos3);

 

Fukcja ta jest wywolywana w pętli. Zależy mi na tym by za każdym razem, kiedy któryś z tych przypadków zdaży się pętla była przerywana. Nie wiem czy tak sie da O_o? Jesli nie, a macie jakieś pomysły to możecie coś mi podrzucić :)

Edytowane przez kaczka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

próbowałem to, ale kompilator krzyczy:

 

86 F:\Dev-Cpp\projekty\szyfr przesuwajacy\szyfr_przesuwajacy_1.cpp break statement not within loop or switch

 

:S

 

EDIT:

 

Ok, opisze dokładniej jak wygląda mój program i jak zamierzam, aby ten program działał. Najistotniejsze dla mnie w programie jest to, aby wprowadzony tekst analizować znak po znaku z pewnym wzorcem i w związku z zaistniałym porównaniem zrobić jedną z 3 operacji na tym łańcuchu.

Zrobiłem jedną pętle, która przechodzi przez cały tekst, w niej jest 2 pętla, w której wywoływana jest funkcja, która analizuje tekst w oparciu o wzorzec ( ta funkcja z 3 if'ami ).

 

 

for(x = 0; x <= strlen(tekst); x++)

{

for(y = 0; y <= 25; y++)

{

asdf[x] = porownaj(a, e, w, d);

}

}

 

/- porownaj -/

 

 

if(warunek1)

{

ble

return cos1;

}

 

if(warunek2)

{

bla

return cos2;

}

 

if(warunek3)

{

asdf

return cos3;

}

 

/---/

 

Więc przy takiej konstrukcji jest pewien problem, bo nawet jak fukcja znajdzie wzorzec i coś zrobi z tym tekstem, to przejdzie do kolejnego wykonania pętli. Jeden z warunków odnosi się do sytuacji, kiedy wzorzec nie jest odnaleziony i w łańcuchu w to miejsce wrzuca znak "specjalny". Więc najpierw będzie porównywał element łańcucha z 1 elementem wzorca, i jeśli on nie będzie on taki sam to wrzucony zostanie znak specjalny. Następny krok w petli i tak, aż dojdziemy do porównania gdzie znak łańcucha będzie równał się znakowi wzorca i wtedy zostanie wpisany w to miejsce nowy wygenerowany na podstawie pewnego algorytmu znak ( tutaj powinno być przejście do kolejnego elementu w łańcuchu ). Następnie w kolejnym wykonaniu ta pozycja zostanie zapisana znakiem specjalnym, po znak nie będzie odpowiadał żadnemu wzorcowi. Mam nadzieje, że zrozumieliście o co mi chodzi :)

Edytowane przez kaczka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/***********

if(warunek)

{

bla

return cos2

break;

 

*************/

 

cos takiego nie zabardzo ma sens. Jesli używasz return wnoskuje ze ta petla wraz z warunkami jest w osobnej funkcji. Muisz wiedziec ze jesli dasz return (cos) to odrazu "opuszczamy funkcje" tak wiec break jest niepotrzebny.

 

if(warunek1) return wart1;

if(warunek2) return wart2

else return wart3;

 

Tutaj zalozylem ze jesli nie spelnia pierwszego i drugiego warunku to musi spelnic ten trzeci. jesli tak nie jest to poprostu zamast else zastoduj if..

 

Tak na przyszłość poczytaj o instrukcji switch() przyda sie jesli bedziesz mial kilka warunkow do rozpatrzenia...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok zrobiłem, wyszło mi. Wziołem w funkcje jedną pętle i zadziałąło. Nie wiem czemu wcześniej myślałem, że funkcja nie będzie działała poprawnie jak dam do niej jeszce tą pętle. Działą wszysto. Dzięki wszystkim za pomoc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wskaźniki które pokazuja w pamięci łańcuchy znakowe powinny być oznaczone lepiej jako const char * wskaznik = "napis" ; wtedy przez przypadek nic do takiego napisu juz nie "dodamy" :D :D :D

 

W każdym nowoczesnym języku programowania także i w c++ jest taka fajna klasa string a włąściwie szablon i taki napis string który ma swoje bardzo ciekawe metody niesamowicie upraszcza wszysktie operacje na tekscie.

 

string napis ;

 

i wtedy takie cudo ma w możę kożystać z metod jakie są w tej klasie niektóre z nich : to napis.size() , napis.clear() , napis.length() , napis.resize(), i wiele , wiele innych.

 

co prawda za takie wygody trzeba płacić nieco szybkością string jest wolnijszy niż tablice i napisy wskaźnikowe ale w c++ i tak jest to realizowane najszybciej!! Stosuj stringi no chyba że jesteś maniakiem wydajności , albo piszesz program który ma działać jak najszybiciej tylko sie da.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...