Valori functie strstr()

Intrebari despre limbajul C++/CLI (si versiunile mai vechi MC++), applicatii mixed-mode sau probleme specifice .NET legate de C++.
Post Reply
User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Valori functie strstr()

Post by curiosul » 10 Nov 2011, 00:09

Avem urmatorul cod:

Code: Select all

char string1[] = this->textBox1->Text;
if((strstr (string1, "@" ) && strstr (string1, "." ))  != NULL ) { //etc }
Cand il compilez ma lovesc de urmatoarea eroare:

Code: Select all

error C2440: 'initializing' : cannot convert from 'System::String ^' to 'char []'
Daca inlocuiesc

Code: Select all

char string1[] = this->textBox1->Text;
cu

Code: Select all

char string1[] = "cuvant";
merge perfect! Deci problema este aici!
Am incercat in toate modurile sa fac acea conversie dar nu vrea...

Stiti cumva cum as putea converti acea valoare? Sau cum sa preiau valoarea campului!

Mersi!


Cea mai buna batalie este cea castigata fara lupta.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Valori functie strstr()

Post by bu7ch3r » 10 Nov 2011, 00:37

AI la metode:)
http://support.microsoft.com/kb/311259

Pe langa asta ma intreb:
String-ul ala n-are metode ajutatoare ? gen find('x') care sa-ti intoarca indexul primei aparitii a caracterului tau? Sau ceva de genul

Code: Select all

public:
int IndexOf(
	wchar_t value, 
	int startIndex
)
In cazul in care ai avea if-ul tau ar fi:

Code: Select all

if (string1.IndexOf('@',0) >= 0 && string1.IndexOf('.',0) >= 0)
//ACESTA ESTE UN MAIL VALID !!!! ---- sau nu, pentru ca dupa cum vrei tu sa faci @claudiu.lupu@cemailpericulos.am@.com e:)
Gasesti pe google cod care te-ar ajuta sa validezi un e-mail dar trebuie sa-l adaptezi :)

Doar pentru curiozitatea mea: Tu in ce limbaj de programare vorbesti ? :)
Cu stima,
Lupu Claudiu

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Valori functie strstr()

Post by Marius Bancila » 10 Nov 2011, 09:53

[ redirectionat ]

Problema e ca System::String nu are un operator de conversie implicita la char[] (mai ales ca System::String nu foloseste char ci wide char).

Pe de alta parte asta merge

Code: Select all

char string1[] = "cuvant";
pentru ca "cuvant" e un string literal care are o adresa, cu care string1[], care e de fapt tot un pointer, se poate initializa.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Valori functie strstr()

Post by Ovidiu Cucu » 10 Nov 2011, 10:24

bu7ch3r wrote:...
Doar pentru curiozitatea mea: Tu in ce limbaj de programare vorbesti ? :)
Cred ca se numeste "Carcalete" (C++/CLI + C(RT)). :)
Dupa cum bine se stie, carcaletele provoaca mahmureala si dureri de cap. Printre retetele strong bine cunoscute se numara Bere + Vodka si MFC + STL :D.
Deci recomandare: daca pui in pahar C++/CLI/alta_licoare_dotnet, atunci pe cat posibil adauga doar doar ingrediente .NET.

In cazul nostru, se poate consuma cu incredere String::IndexOf Method, asa cum a sugerat deja bu7ch3r.
Exemplu:

Code: Select all

   if((-1 != textBox1->Text->IndexOf("@")) && (-1 != textBox1->Text->IndexOf(".")))
   {
      // etc
   }

User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Re: Valori functie strstr()

Post by curiosul » 10 Nov 2011, 10:40

@bu7ch3r: Am ajuns si la adresa aia si la multe altele dar in nici-un exemplu nu am vazut ceea ce vreau eu! Adica sa preiau caracterele dintr-un text.Box iar dupaia sa le convertesc si sa le introduc intr-o functie gen strstr, strcmp etc!
Folosesc Visual C++ 2010 Express
Te referi la stringul asta ca fiind ajutator?

Code: Select all

char *strstr(char *str,  const char *strSearch); 
Am incarcat si asa dar nu imi poate include fisierul header #include <atlstr.h>

Code: Select all

System::String * str = S this->texBox1->Text;
					 CString str3(str); 
					 //printf(str3);
					 //char string1[] = this->textBox1->Text;
						
					if((strstr (str, "@" ) && strstr (str, "." ))  != NULL ) { 
@Ovidiu Cucu: Aha, asta merge, deci cand preiau valoarea dintr-un text.Box folosesc IndexOf
Am observat ca fara -1 != IndexOf nu merge! Dar merge si daca ii dau -2 sau alta valoare negativa, acea valoare verifica cumva daca textul este in codul ASCII sau cum?
Cea mai buna batalie este cea castigata fara lupta.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Valori functie strstr()

Post by bu7ch3r » 10 Nov 2011, 10:58

Din cate stiu eu:
CString is an MFC class. MFC and ATL are not included with the Express Edition of VC++.

Dar "IndexOf" face acelasi lucru ca si strstr, inca mai bine si e nativ pentru ce faci tu acolo :)

IndexOf intoarce index-ul unde gaseste caracterul:
Daca aveai "mosCraciun@PolulNord" iti intorcea 10
Daca aveai "@mosCraciun@polulNord" iti intorcea 0
Daca avea "mosCraciun" iti intoarce -1

Documentatia lui IndexOf spune ca intoarce -1 cand nu ai caracterul in string.
Cu stima,
Lupu Claudiu

tudor_t
Membru
Membru
Posts: 112
Joined: 26 Aug 2007, 15:11

Re: Valori functie strstr()

Post by tudor_t » 10 Nov 2011, 11:24

curiosul wrote:@bu7ch3r: Am ajuns si la adresa aia si la multe altele dar in nici-un exemplu nu am vazut ceea ce vreau eu! Adica sa preiau caracterele dintr-un text.Box iar dupaia sa le convertesc si sa le introduc intr-o functie gen strstr, strcmp etc!
Daca la clasa String din .NET te referi, acolo ai de ex. ToCharArray():
http://msdn.microsoft.com/en-us/library/ezftk57x.aspx
care intoarce un array<wchar_t>^ .. (si probabil nu e la fel de eficienta ca metoda descrisa la http://support.microsoft.com/kb/311259 )

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Valori functie strstr()

Post by Ovidiu Cucu » 10 Nov 2011, 11:30

curiosul wrote: ...
Am incarcat si asa dar nu imi poate include fisierul header #include <atlstr.h>
...
Daca amestecam si ATL-ul,... asta da carcalete! :)
Mai punem si-o lingura cu MFC, un varf de cutit de STL iar Boost... dupa gust.
La ocazii speciale, se poate adauga si un pachetel de Qt. :D

Deci, serios, apasa mai intai aici, cat se poate de recursiv.
Dupa aia putem sta la un pahar de vorba sa vedem daca mai lipseste ceva pe-acolo, daca exista cazuri in care musa-i sa folosim functii din biblioteca C ca strstr, strcmp etc in .NET (eu cred ca in general, nu), cum convertim System::String la char* sau wchar_t* (vezi ca Marius a facut deja o aluzie) si cum se prepara alte cocktail-uri in asa fel incat sa nu ne doara capul. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Valori functie strstr()

Post by Ovidiu Cucu » 10 Nov 2011, 13:16

tudor_t wrote:
curiosul wrote:@bu7ch3r: Am ajuns si la adresa aia si la multe altele dar in nici-un exemplu nu am vazut ceea ce vreau eu! Adica sa preiau caracterele dintr-un text.Box iar dupaia sa le convertesc si sa le introduc intr-o functie gen strstr, strcmp etc!
Daca la clasa String din .NET te referi, acolo ai de ex. ToCharArray():
http://msdn.microsoft.com/en-us/library/ezftk57x.aspx
care intoarce un array<wchar_t>^ .. (si probabil nu e la fel de eficienta ca metoda descrisa la http://support.microsoft.com/kb/311259 )
Clar, .NET-ul lasa mici scapari si nu-i rau, n-ar srica putina "iarba" la ocazii speciale. :)
Pericolul apare atunci cand se ceeaza dependenta si se-ajunge sa se umple codul managed cu buffere C-style si apeluri din bibloteca C.
Mai mult, la overdoze apare inevitabil si mbstowcs cu sora ei geamana wcstombs (deh, dotnetu umbla cu UNICODE iar noi la scoala invatam ANSI) plus alocarile de rigoare de nu mai stie nici garbage colectorul pe ce geam sa se-arunce de zici c-a luat LSD. :D

Foarte serios:
Cel putin in problema noastra de aici, NU este absolut nici o nevoie de strstr, strcmp si altele asemeni lor.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Valori functie strstr()

Post by bu7ch3r » 10 Nov 2011, 13:37

Mai este si MultiByteToWideChar si WideCharToMultiByte care e mai pamantesc, mbstowcs are un bug pe chineza si coreana din cate imi aduc eu aminte. Dar astea sunt alta poveste...
Cu stima,
Lupu Claudiu

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Valori functie strstr()

Post by Ovidiu Cucu » 10 Nov 2011, 15:20

bu7ch3r wrote:Mai este si MultiByteToWideChar si WideCharToMultiByte care e mai pamantesc, mbstowcs are un bug pe chineza si coreana din cate imi aduc eu aminte. Dar astea sunt alta poveste...
[ off-topic ]
Da stiu, dupa se umple cu purici, cainele e chinuit cu MultiByteToWideChar si WideCharToMultiByte (faza advanced, in care se inlocuiesc mbstowcs si wcstombs) in loc sa i se dea cu flit.
Am intalnit asta intr-un proiect pentru WinCE, in care nici de-al draq nu facea nimeni deparazitare sa-l scape de char si std::string. :)

User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Re: Valori functie strstr()

Post by curiosul » 10 Nov 2011, 19:18

Wow, m-am ametit :)
Eu am folosit functia strstr pentru ca aia am invatat-o la scoala, atata tot!
Totusi vad ca au aparut o multime de termeni noi gen ATL, STL, Boost etc., de ce nu e bine sa includ functii din librariile C intr-un program .NET? Care este diferenta intre ele?

Edit: Cred ca am inteles ce a zis Marius prima data... WideCharToMultiByte
Cea mai buna batalie este cea castigata fara lupta.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Valori functie strstr()

Post by bu7ch3r » 10 Nov 2011, 22:43

Eu sunt Claudiu, Marius e Marius :)) Nu te speria, ia-o incet. La scoala ai invatat "C cu cin si cout", acum in ce programezi e mult mai evoluat, are fente menite sa-ti usureze munca. Documenteaza-te si la un moment dat o sa poti vorbi si tu de ATL si STL(asta daca nu dispare, am inteles ca a mai ramas numai un om sa intretina codul :)) ) Succes!

Si vezi ca WideCharToMultiByte are vreo 7 parametrii si trebuie apelat de 2 ori si trebuie sa aloci memorie deci e baja ;) Dintre toate asta e cea mai greu de folosit si in cazul tau total inutila.
Cu stima,
Lupu Claudiu

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Valori functie strstr()

Post by Marius Bancila » 11 Nov 2011, 13:35

Se mai poate si asa pt. a converti un System::String la un ANSI string nativ.

Code: Select all

IntPtr strptr = Marshal::StringToHGlobalAnsi(this->textBox1->Text);
const char* str = (const char*)strptr.ToPointer(); // poate fi si fara const, doar char*

// aici faci ceva cu str

Marshal::FreeHGlobal(strptr);
Dar chiar ai nevoie? Eu cred ca poti folosi cu success tot ce-ti pune la dispozitie System::String. N-ai invatat la scoala? Pai si ce? O sa programezi doar cu ce ai invatat la scoala?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply