C ++ strtok функциясы

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

Неліктен бұл функция бүкіл аралықта бірінші таңбаны ғана қайтарады? Аралықты «fsa rew qwe» деп орнатсам, «f» дегеннің орнына «f» қайтарады.

«mÀ * £» - енді менің алдым. неге?

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

1
C ++-де неге жұмыс істеп жатқаны туралы ештеңе білмегенде, сіз C жолдарын және std :: strtok() std :: string қолданыңыз, бұл жаңа бастағандар үшін әлдеқайда оңайырақ. Өзіңізді жақсы C ++ кітабын алыңыз.
қосылды автор sbi, көзі

3 жауаптар

Қайтарылатын түріңіз - символды білдіретін char болғандықтан және strtok() арқылы қайтаратын көрсеткішті алып тастаңыз.

2
қосылды

char мәнін қайтаратындықтан, ол тек p көрсеткіші арқылы көрсетілген жолдың бірінші таңбасын білдіреді .Сіздің char * сіздің функцияңыз.

Сіздің функцияңыз прототипі болуы керек:

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
қосылды
кәдімгі символы емес, char болуы керек. char - таңба, char * (символдар жиынтығы) - бұл жол. Қазір сіз жасай отырып, мәтінді алады, содан кейін бірінші таңбаны кәдімгіге көшіріңіз. Содан кейін сіз өзіңіздің думыңыздың мекен-жайын сіздің жолыңыздан өткізесіз, бірақ бұл жол емес, бұл таңба. ParseCmd() жолды күтуде, сондықтан ол жадқа дейін нөлге жеткенге дейін оқуды жалғастырады, сондықтан сіз қоқыс шығарып жатырсыз.
қосылды автор GazTheDestroyer, көзі
Рақмет сізге! Мен мұны тырысамын
қосылды автор Hakon89, көзі
енді бұл жолды «mÀ * *» алайық, бірақ тозақ? мен тағы не дұрыс емес істеймін?
қосылды автор Hakon89, көзі
char dum = * InstList-> Lines-> GetText (); char * dum1 = ParseCmd (& dum, 32); InstList-> Lines-> Add (dum1);
қосылды автор Hakon89, көзі
Рақмет сізге! бірақ TMemo-дан жолды алғым келсе?
қосылды автор Hakon89, көзі
жақсы рахмет. ауырып оқыды.
қосылды автор Hakon89, көзі
@ Hakon89: Бағдарламаңызды жіберіңіз.
қосылды автор Alok Save, көзі
@ Hakon89: Үлгілік бағдарлама қосылды.
қосылды автор Alok Save, көзі
@ Hakon89: TMemo дегеніміз не? Әдетте сіздер үшін жазу кодын жасамаймыз, бірақ жай ғана проблемаларды қалай шешуге қатысты нұсқаулықтарды ұсынамыз. Бұл жерде кодты енгіздім, себебі сіз пайдалану туралы шатастырдық деп ойладыңыз, Кітапты қараңыз немесе проблемаларды анықтау үшін strtok құжатын қараңыз және тек қашан Сіз белгілі бір проблемамен тоқтадыңыз. Және ешқандай құқық бұзушылық емес, бірақ мұнда ол осында жұмыс істейді.
қосылды автор Alok Save, көзі

Кез-келген C-стилі сияқты, p - бұл шын мәнді массив. Егер сіз оны қабылдамасаңыз, сіз кейіпкер аласыз. return * p орнына ParseCmd return

/.

0
қосылды