C ++ strtok işlevi

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

Bu işlev neden sadece bir bütün tamponda ilk sembolü döndürüyor? Bir "fsa rew qwe" ye arabellek ayarlarsam, beklenen "fsa" yerine sadece "f" değerini döndürür.

"mÀ £ *" - şimdi imlaşıyorum. niye ya ?

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

1
Niçin C ++ 'da C dizeleri ve std :: strtok() kullanıyorsunuz? Yeni başlayanlar için çok daha kolay std :: string kullanın. Ve kendinizi iyi bir C ++ kitabı edinin.
katma yazar sbi, kaynak

3 cevap

Dönüş türünüz bir karakteri temsil eden char olduğundan ve işaretçinin strtok() tarafından döndürüldüğünden emin olun.

2
katma

char değerini döndürdüğünüzden, bu, p işaretçisi tarafından işaret edilen dizenin yalnızca ilk karakteri anlamına gelir. char * değerini döndürmeniz gerekir. senin işlevin.

İşlevin prototip olmalı:

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
katma
dum da char olmalı *, char değil. char bir karakterdir, char * (set of) karakterlere bir işaretçi - yani bir dizedir. Şu anda yapmakta olduğunuz şey metni almak, ardından ilk karakteri kopyalamaktır. Daha sonra dum adresini dize olarak geçiriyorsunuz, ama bu bir dize değil, bir karakter. ParseCmd() bir dize bekler, bu yüzden bir null vuruncaya kadar bellekte okuma devam edecek, bu yüzden çöp alıyorsunuz.
katma yazar GazTheDestroyer, kaynak
Teşekkür ederim! Bunu dene
katma yazar Hakon89, kaynak
ve şimdi bu dizgeyi "mÀ £ *" alıyorum ama cehennem? tekrar ne yapıyorum
katma yazar Hakon89, kaynak
char dum = * InstList-> Lines-> GetText (); char * dum1 = ParseCmd (& dum, 32); InstList-> Lines> (dum1) ekleyin;
katma yazar Hakon89, kaynak
Teşekkür ederim! ama ya bir TMemo'dan bir ip almak istersem?
katma yazar Hakon89, kaynak
tamam teşekkürler. okudu.
katma yazar Hakon89, kaynak
@ Hakon89: Lütfen programınızı gönderin.
katma yazar Alok Save, kaynak
@ Hakon89: Örnek bir program eklendi.
katma yazar Alok Save, kaynak
@ Hakon89: TMemo nedir? Lütfen, genellikle sizin için yazacağız kodunun kullanılmadığını, ancak sorunlarınızın nasıl çözüleceğine dair yönergeler sağladığımızı lütfen unutmayın. Kodu ekledim çünkü kullanım hakkında kafanız karıştığını düşündüm, iyi bir şey okumalısınız. Sorunlarınızı çözmek için strtok dokümanlarına bakın veya sadece belirli bir problemde sıkışıp kaldınız.Ve hiç bir suç yok ama işte bu şekilde çalışıyor.
katma yazar Alok Save, kaynak

C stili bir string gibi, p aslında bir karakter dizisidir. Eğer ondan vazgeçerseniz, bir karakter elde edersiniz. return * p yerine ParseCmd p 'nı döndürün.

0
katma