1

Тема: Повернення char* (new char) з функції.

Якщо вертати числовий тип, то програма працює, а якщо char - ні, потрібна допомога :}

#include <iostream> 
using namespace std;
char* topfunkcia(char riadok2)
{
    static  int count(0);
    char *kickback(new char); 
    kickback = "123";
    return kickback;
}

void main()
{
    char riadok[50];
    int answer;

    do
    {
        cout<<"\n1-Vvesty riadok\n2-\n3-\n";
        cin>>answer;
        char* kickback;
        switch(answer)
        { 
            case 1: 
                {
                    cout<<"Vvedit riadok\n";
                    cin>>riadok;
                    char *ptr=nullptr;
                    ptr= topfunkcia(riadok[50]);
                    cout<<endl<<ptr; 
                    delete [] ptr;
                    ptr=0;
                break;
                }
            case 2:
                break;
            case 3:
                break;
            default:
                cout<<"\nError!";
        }
    }while(answer!=3);


    system("pause");
}

2

Re: Повернення char* (new char) з функції.

"123" - це вказівник, використовуйте strcpy.
new char - не вказано розмір.

Подякували: Dopamine1

3 Востаннє редагувалося koala (19.08.2015 15:44:42)

Re: Повернення char* (new char) з функції.

От саме тому я й кажу, що C/C++ - погана мова для початківців...
Краще використовуйте std::string і не парте собі і нам мізки. Коротко:

    char *kickback(new char); //kickback вказує на область пам'яті в 1 байт, виділену в купі 
    kickback = "123"; //kickback вказує на константний рядок "123", виділена пам'ять загубилася

А вам треба щось зовсім інше.

Подякували: quez, Dopamine2

4

Re: Повернення char* (new char) з функції.

Хто-небудь підкаже чому при надсиланні більше одного слова в функцію вона вертає значення не таке як при одному?

#include <iostream>  

using namespace std;
char* topfunkcia(char* riadok2)
{
    static unsigned short count(0);
    char *Hold = new char[strlen(riadok2)+1];
    strcpy(Hold,riadok2);
    char *buf=strstr(Hold," ");
    buf='\0';
    char *kickback(new char[strlen(Hold)+1]);  
    strcpy (kickback, Hold);  
    return kickback;
}
void main()
{
    
    char riadok[50];
    int answer;

    do
    {
        cout<<"\n1-Vvesty riadok\n2-Vyzvaty funkciy again\n3-exit\n";
        cin>>answer;
        switch(answer)
        { 
            case 1: 
                {
                    cout<<"Vvedit riadok\n";
                    cin>>riadok;
                    char *ptr=nullptr;
                    ptr= topfunkcia(riadok); 
                    cout<<endl<<ptr;
                    delete ptr;
                    ptr = nullptr;
                    break; 
                }
            case 2:
                topfunkcia(NULL);
                break;
            case 3:
                break;
            default:
                cout<<"\nError!";
        }
    }while(answer!=3);


    system("pause");
}

5

Re: Повернення char* (new char) з функції.

Dopamine написав:

Хто-небудь підкаже чому при надсиланні більше одного слова в функцію вона вертає значення не таке як при одному?

Мабуть, тому, що вона має так працювати.
А взагалі - формулюйте питання по-людськи, то матимете людську відповідь. Крім коду, ще треба написати завдання (що ви взагалі робите) і опис проблеми (що хочете побачити, а що бачите). Причому все конкретно, а не загальними словами.
Так, і не забувайте видаляти пам'ять. На кожен new - свій delete.

6

Re: Повернення char* (new char) з функції.

А як ви туди надсилаєте багато слів ? cin працює до пробілу використовуйте getline, зверніть увагу на рядок 30

#include <iostream>  

using namespace std;
char* topfunkcia(char* riadok2)
{
    static unsigned short count(0);
    char *Hold = new char[strlen(riadok2) + 1];
    strcpy(Hold, riadok2);
    char *buf = strstr(Hold, " ");
    buf = '\0';
    char *kickback(new char[strlen(Hold) + 1]);
    strcpy(kickback, Hold);
    return kickback;
}
void main()
{

    char riadok[50];
    int answer;

    do
    {
        cout << "\n1-Vvesty riadok\n2-Vyzvaty funkciy again\n3-exit\n";
        cin >> answer;
        switch (answer)
        {
        case 1:
        {
            cout << "Vvedit riadok\n";
            cin.get();
            cin.getline(riadok, 50);
            char *ptr = nullptr;
            ptr = topfunkcia(riadok);
            cout << endl << ptr;
            delete ptr;
            ptr = nullptr;
            break;
        }
        case 2:
            topfunkcia(NULL);
            break;
        case 3:
            break;
        default:
            cout << "\nError!";
        }
    } while (answer != 3);


    system("pause");
}
Подякували: Dopamine1

7

Re: Повернення char* (new char) з функції.

Betterthanyou написав:

А як ви туди надсилаєте багато слів ? cin працює до пробілу використовуйте getline, зверніть увагу на рядок 30

Вау, ніби вивчаю C майже рік, а не знав що cin працює лише до пробілу

8

Re: Повернення char* (new char) з функції.

Betterthanyou написав:

А як ви туди надсилаєте багато слів ? cin працює до пробілу використовуйте getline, зверніть увагу на рядок 30

#include <iostream>  

using namespace std;
char* topfunkcia(char* riadok2)
{
    static unsigned short count(0);
    char *Hold = new char[strlen(riadok2) + 1];
    strcpy(Hold, riadok2);
    char *buf = strstr(Hold, " ");
    buf = '\0';
    char *kickback(new char[strlen(Hold) + 1]);
    strcpy(kickback, Hold);
    return kickback;
}
void main()
{

    char riadok[50];
    int answer;

    do
    {
        cout << "\n1-Vvesty riadok\n2-Vyzvaty funkciy again\n3-exit\n";
        cin >> answer;
        switch (answer)
        {
        case 1:
        {
            cout << "Vvedit riadok\n";
            cin.get();
            cin.getline(riadok, 50);
            char *ptr = nullptr;
            ptr = topfunkcia(riadok);
            cout << endl << ptr;
            delete ptr;
            ptr = nullptr;
            break;
        }
        case 2:
            topfunkcia(NULL);
            break;
        case 3:
            break;
        default:
            cout << "\nError!";
        }
    } while (answer != 3);


    system("pause");
}

Але чому без  cin.get(); програма не працює? Я навчаюсь за книгою і вона, ніби, не стара, 2011 року, але там немає  cin.get();
За книжним варіантом функція  не читає.

9 Востаннє редагувалося Betterthanyou (22.08.2015 17:48:48)

Re: Повернення char* (new char) з функції.

Dopamine написав:

ніби вивчаю C майже рік

Можливо я помиляюся але cin i cout немає в С (це С++) там printf scanf, я вивчав основи С++ по книзі Я.М.Глинського С++ & Builder ст 85-86 там є написано як працювати з рядками

10

Re: Повернення char* (new char) з функції.

Dopamine написав:

Але чому без  cin.get(); програма не працює?

Ваша програма починається проханням вибрати щось із меню 1, 2, 3 користувач вибирає щось і натискає Enter а getline зчитує цей Enter от і нічого не виходить тому потрібно поставити cin.get() щоб він зчитав цей Enter. Якщо б вас не було меню то cin.get() був б не потрібним

Подякували: Dopamine1

11

Re: Повернення char* (new char) з функції.

Тому що стандарт колись погано розписував, як саме треба обробляти вхідні потоки, і різні компілятори пододавали різноманітні "зручності", наприклад, введення рядків з пробілами, прибирання "зайвих" нових рядків при введенні, перехоплення клавіатури при введенні окремих символів і т.д. Це все ламало одноманітність файлового і консольного введення, зате було простіше для розуміння новачками.
Якщо дуже коротко, то в C++ є кілька різних режимів введення. Якщо їх змішувати, доводиться дописувати оці get і clear на переходах. Основний режим - operator >> - працює з токенами, тобто пробіл і новий рядок сприймаються як межі одиниць введення. Альтернатива - getline - потребує подальшого розбору введених рядків всередині програми (за допомогою, наприклад, stringstream). Ще один варіант - функції з cstdio.