C ++ strtok funktsiyasi

char ParseCmd(char *buf,int len)
{
     char *p;
     p = strtok(buf," ");
     return *p;
}

Nima uchun bu funksiya faqat bitta belgini butun buferda qaytaradi? Agar buferni "fsa rew qwe" ga o'rnatadigan bo'lsam, u faqat "f" o'rniga "f" ni qaytaradi.

"mÀ * *" - bu endi mamnun. nima uchun?

char dum = *InstList->Lines->GetText(); LoadLibrary("SyntaxP.dll"); char *dum1 = ParseCmd(&dum,32); InstList->Lines->Add(dum1);

1
Nima uchun C ++ da C kodini va std :: strtok() dan foydalanasiz? std :: string dan foydalaning, bu yangi boshlanuvchilar uchun juda oson. Yaxshi C ++ kitobini eng qisqa vaqt ichida olishingiz mumkin.
qo'shib qo'ydi muallif sbi, manba

3 javoblar

Qaytish turi char belgisi bo'lib, strtok() tomonidan qaytib kelgan markerni o'zgartirasiz.

2
qo'shib qo'ydi

Agar char qiymatini qaytarayotgan bo'lsangiz, bu faqat pointer P ko'rsatgichi bilan ishlangan simning birinchi belgisini anglatadi .Shuning uchun char * vazifangiz.

Funktsiyangiz prototipga ega bo'lishi kerak:

char* ParseCmd(char *buf,int len);
^^^^^

Online Demo:

#include
#include
#include

char* ParseCmd(char *buf,int len)
{
     char *p;
     p = strtok(buf," ");
     char *ptr = (char *)malloc(strlen(p)+1);
     strncpy(ptr,p,strlen(p));
     return ptr;
}

int main()
{
    char array[]="fsa rew qwe";
    char* ret = ParseCmd(array,11);
    printf("[%s]",ret);

    /*If You Forget this,You cause a Memory Leak*/    
    free(ret);

    return 0;
}

Output:

[fsa]

Disclaimer: I have not really used any C++ in the code because since You are using strtok and char * instead of string I believe the Q is more C than C++.

1
qo'shib qo'ydi
dum ham char bo'lishi shart emas, char. char - belgi, char * belgisi (majmui) belgisidir - ya'ni, mag'lubiyat. Siz hozirda nima qilmoqchi bo'lsangiz, u matnni oladi, keyin birinchi belgini kuyikka ko'chirish. Keyinchalik siz dum manzili o'zingizning stringingizdan o'tib ketasiz, biroq bu satr emas, bu belgi. ParseCmd() bir mag'lubiyat kutadi, shuning uchun xotiradan nolga tekkancha o'qishni davom ettiradi, shuning uchun siz axlatni chiqarasiz.
qo'shib qo'ydi muallif GazTheDestroyer, manba
Rahmat! Buni sinab ko'rdim
qo'shib qo'ydi muallif Hakon89, manba
Endi esa "mÀ * *" bu mag'lubiyatni olaman, lekin jahannammi? Men yana nima qilyapman?
qo'shib qo'ydi muallif Hakon89, manba
char dum = * InstList-> Lines-> GetText (); char * dum1 = ParseCmd (& dum, 32); InstList-> Lines-> Qo'shish (dum1);
qo'shib qo'ydi muallif Hakon89, manba
Rahmat! Lekin TMemo'dan mag'lubiyatga ega bo'lishni istasam nima bo'ladi?
qo'shib qo'ydi muallif Hakon89, manba
rahmat. yomon o'qish.
qo'shib qo'ydi muallif Hakon89, manba
@ Hakon89: Iltimos, dasturni joylashtiring.
qo'shib qo'ydi muallif Alok Save, manba
@ Hakon89: Namunaviy dastur qo'shildi.
qo'shib qo'ydi muallif Alok Save, manba
@ Hakon89: TMemo nima? Shuni esda tutingki, odatda siz uchun yozish kodi yo'q, faqat sizning muammolarni qanday hal qilish bo'yicha yo'riqnomani taqdim etamiz. Bu erda kodni qo'shib qo'ydim, chunki siz foydalanish haqida shubhalangan deb o'ylayman, muammolaringizni tushunib olish uchun faqatgina strtok hujjatlarini ko'ring va qachon Siz muayyan muammoga duch keldingiz. Hech qanday huquqbuzarlik yo'q, lekin bu bu erda ishlaydi.
qo'shib qo'ydi muallif Alok Save, manba

Har qanday C uslubidagi string kabi, p aslida belgi qatori. Agar siz uni rad etsangiz, siz bir belgi olasiz. return * p o'rniga ParseCmd return p ni kiriting.

0
qo'shib qo'ydi