C/C++: pole znakov

Programovacie jazyky, rady, poradňa...
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

C/C++: pole znakov

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

Zdravim,
pol dna som tu riesil jeden problem a vyriesil som ho takym dost divnym sposobom, a chcel by som to zapisat lepsie.
Potrebujem pole 32 znakov (defacto string) ale nesmie byt null-terminated. Ak ma obsahovat nieco, co je kratsie, tak zvysne znaky doplnim medzerami. Urobil som to takto:

Kód: Vybrať všetko

	pInfo->libraryDescription[0] = 'W';
	pInfo->libraryDescription[1] = 'M';
	pInfo->libraryDescription[2] = 'P';
	pInfo->libraryDescription[3] = 'K';
	pInfo->libraryDescription[4] = 'C';
	pInfo->libraryDescription[5] = 'S';
	pInfo->libraryDescription[6] = '#';
	pInfo->libraryDescription[7] = '1';
	pInfo->libraryDescription[8] = '1';
	pInfo->libraryDescription[9] = ' ';
	pInfo->libraryDescription[10] = '-';
	pInfo->libraryDescription[11] = ' ';
	pInfo->libraryDescription[12] = 'f';
	pInfo->libraryDescription[13] = 'o';
	pInfo->libraryDescription[14] = 'r';
	pInfo->libraryDescription[15] = ' ';
	pInfo->libraryDescription[16] = 'W';
	pInfo->libraryDescription[17] = 'i';
	pInfo->libraryDescription[18] = 'n';
	pInfo->libraryDescription[19] = 'd';
	pInfo->libraryDescription[20] = 'o';
	pInfo->libraryDescription[21] = 'w';
	pInfo->libraryDescription[22] = 's';
	pInfo->libraryDescription[23] = ' ';
	pInfo->libraryDescription[24] = 'M';
	pInfo->libraryDescription[25] = 'o';
	pInfo->libraryDescription[26] = 'b';
	pInfo->libraryDescription[27] = 'i';
	pInfo->libraryDescription[28] = 'l';
	pInfo->libraryDescription[29] = 'e';
	pInfo->libraryDescription[30] = ' ';
	pInfo->libraryDescription[31] = ' ';
ale chcel by som to zapisat elegantnejsie. Je to mozne?
pInfo je pointer na struct, ktory ma v sebe aj prvok libraryDescription, ktory je typu unsigned char[32].
Najde sa tu expert, ktory mi pomoze? Prosim :)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C/C++: pole znakov

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

Je to C funkcia:

Kód: Vybrať všetko

#include<stdlib.h>
#include<string.h>

void SupHoTamSTestxom(pInfo *p, char *text)
{
 memset(p->libraryDescription,' ', 32 );
 int size=strlen(text);
 memcpy(text,p->libraryDescription,(size<32)? size:32 );
}

//pouzijes to takto:
SupHoTamSTestxom( pInfo, "Tvoj text");
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Re: C/C++: pole znakov

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

harrison314, vdaka za ochotu ale takto to nepojde, kedze to, co bude v tej alokovanej pamati, bude 'T','v','o','j',' ','t','e','x','t','\0' a dalej nejake nahodne znaky. Ja potrebujem prave, aby tam ten NUL terminator nebol :)

//autoeditácia príspevku (18 Júl 2010, 14:05)
Predtym som to mal spravene takto:

Kód: Vybrať všetko

*pInfo->libraryDescription = *new unsigned char[32]=('W','M','P','K','C','S','#','1','1',' ','-',' ','m','o','d','u','l','e',' ','f','o','r',' ','W','i','n','M','o','b','i','l','e');
ale pri debugovani som zistil, ze ten retazec vobec neobsahoval to, co mal, namiesto toho tam bolo toto " ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ" (priblizne). Aspon tak sa to zobrazilo vo visual studiu na breakpointe.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C/C++: pole znakov

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

Uz si ju skusal? Mne to ide na gcc tak ako ma.

A retazec sa v C++ alokuje:

Kód: Vybrať všetko

pInfo->libraryDescription =new char[23];
Takto ho alokuj a potom pouzi moju proceduru.

Tam ta nula nebude, pretoze pouzivam memcpy a nie strcpy.
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Re: C/C++: pole znakov

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

Oukej, vdaka. Teraz som si vsimol, ze to mas spravne :) Problem je, ze ten blazen mi berie to char[32] ako obycajny char* a tvrdi, ze nemoze skonvertovat (to vobec nechapem):

Kód: Vybrať všetko

Error	1	error C2440: '=' : cannot convert from 'unsigned char *' to 'unsigned char [32]'	pkcs11.cpp	172	wmpkcs11
Error	2	error C2664: 'NotNullText' : cannot convert parameter 1 from 'unsigned char' to 'char *'	pkcs11.cpp	173	wmpkcs11
Error	3	error C2664: 'strlen' : cannot convert parameter 1 from 'unsigned char *' to 'const char *'	func.cpp	9	wmpkcs11
Mam to takto:

Kód: Vybrať všetko

void NotNullText(unsigned char* out, unsigned char* in)
{
	memset(out,' ', 32 );
	int size=strlen(in);         /// tuna mi hadze tretiu chybu
	memcpy(in,out,(size<32)? size:32 );
}
a volanie:

Kód: Vybrať všetko

	pInfo->manufacturerID = new unsigned char[32];       /// tuna mi hadze prvu chybu
	NotNullText(pInfo->manufacturerID, "Mek");       /// tuna mi hadze druhu chybu
manufacturerID je unsigned char[32] a preto musim mat vsade aj slovko unsigned.

//autoeditácia príspevku (18 Júl 2010, 20:27)
Tak uz to mam, pomohol mi jeden kamarat na ICQ:

Kód: Vybrať všetko

void NotNullText(unsigned char* out, const char* in, int maxsize)
{
	int size=strlen(in);
	if (size > maxsize) {size = maxsize;}
	for (int i=0; i<size; i++) out[i] = in[i];
	for (int i=size; i<maxsize; i++) out[i] = ' ';
}
do hlavickoveho suboru:

Kód: Vybrať všetko

void NotNullText(unsigned char* out, const char* in, int maxsize=32);
volanie:

Kód: Vybrať všetko

NotNullText(pInfo->slotDescription, "aaaaaaaaa");
Funguje presne ako potrebujem, vdaka za help vsetkym zucastnenym.
Napísať odpoveď