Lines->GetText(); "> Lines->GetText(); "> Lines->GetText(); " />

Функція C ++ strtok

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

Чому ця функція повертає тільки перший символ у весь буфер? Якщо я встановлюю буфер у "fsa rew qwe", він повертає тільки "f" замість очікуваного "fsa".

"mÀ £ *" - це тепер. чому?

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

1
Чому ви використовуєте рядки C і std :: strtok() у C ++, коли ви, очевидно, не знаєте, як вони працюють? Використовуйте std :: string , що набагато простіше для початківців. І зробіть собі хорошу книгу C ++ як можна швидше. \ T
додано Автор sbi, джерело

3 Відповіді

Оскільки ваш тип повернення є char , який представляє символ, і ви розмежуєте покажчик, який повертається strtok() .

2
додано

Тому що ви повертаєте значення char , що означає тільки перший символ рядка, вказаний вказівником p . вашої функції.

Ваша функція повинна мати прототип:

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
додано
dum також має бути char *, а не char. char - символ, char * - це вказівник на (набір) символів - тобто рядок. Те, що ви зараз робите, отримуєте текст, а потім копіюєте перший символ у dum. Потім ви передаєте адресу dum як рядок, але це не рядок, це символ. ParseCmd() очікує на рядок, так що він буде продовжувати читання через пам'ять, поки не потрапить в нуль, тому ви отримуєте сміття.
додано Автор GazTheDestroyer, джерело
Дякую! Хворий спробувати це
додано Автор Hakon89, джерело
і тепер я отримую "mA £ *" цю струну, але чорт? Що я знову роблю неправильно?
додано Автор Hakon89, джерело
char dum = * InstList-> Лінії-> GetText (); char * dum1 = ParseCmd (& dum, 32); InstList-> Лінії-> Додати (dum1);
додано Автор Hakon89, джерело
Дякую! але що, якщо я хочу отримати рядок з TMemo?
додано Автор Hakon89, джерело
добре, дякую. погано читати.
додано Автор Hakon89, джерело
@ Hakon89: Будь ласка, напишіть вашу програму.
додано Автор Alok Save, джерело
@ Hakon89: Додано зразок програми.
додано Автор Alok Save, джерело
@ Hakon89: Що таке TMemo ? Зверніть увагу, що зазвичай ми не пишемо код для вас, а просто надаємо рекомендації щодо того, як вирішувати ваші проблеми. Я додав код тут, тому що думав, що ви заплутані щодо використання. забронюйте або перегляньте документацію strtok , щоб з'ясувати ваші проблеми та запитати лише, коли Ви застрягли на певній проблемі. І не ображайтеся, але це так працює тут.
додано Автор Alok Save, джерело

Як і будь-який рядок C-стилю, p фактично є масивом символів. Якщо ви розіменуєте його, ви отримаєте символ. Замість ParseCmd поверніть p замість повернення * p .

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147