1

Тема: Повернення рядка

Привіт, написав функцію переводу з 10 в 2 систему числення, але хочу щоб функція повертала мені потрібний рядок. Допоможіть, будь ласка.

char to2(int num)
{
    int ost;
    char bin[15] = "", bin2[15] = "";
    do
    {
        ost = num % 2; // остача від ділення
        itoa(ost, bin2, 10); strcat(bin, bin2);                 
        num = num / 2;
    } while (num >= 2);
    itoa(num, bin2, 10); strcat(bin, bin2);
      strrev(bin); // виводимо у зворотному порядку
     
          //cout << bin;
      return bin; // потрібно повернути рядок!
}

2 Востаннє редагувалося leofun01 (24.04.2016 10:15:26)

Re: Повернення рядка

vitalii97 написав:

хочу щоб функція повертала мені потрібний рядок.

Ну то повертайте рядок:

char *to2(int num)
{
    int ost;
    char *bin = new char[15], *bin2 = new char[15];
    // ваш код ...
    return bin; // повертає рядок!
}

"char to2(int num)" повертає один символ.

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

3

Re: Повернення рядка

Хм, рішив проблему, створив ще один рядок(buf) глобально, і в функції, цьому рядку присвоїв значення рядка bin. В головній функції просто вивожу buf. Але все ж таки хотілося б дізнатися, як зробити по-нормальному, щоб функція зразу повертала рядок.

4

Re: Повернення рядка

Запропоную свій варіант

#include <iostream>
#include <string>
using namespace std;

string dec2bin(int value){
    string out;
    do
    {
        out.insert(0, (const char *)((value & 0x01) ? "1" : "0"), 1);
    }
    while( value >>= 1 );
    return out;
}

int main(){
    cout<<dec2bin(235)<<endl;
    return 0;
}

Перевірка тут http://codepad.org/PBxWQChC

Post's attachments

Untitled.png 50.48 kb, 164 downloads since 2016-04-24 

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

5

Re: Повернення рядка

vitalii97 написав:

Хм, рішив проблему, створив ще один рядок(buf) глобально, і в функції, цьому рядку присвоїв значення рядка bin. В головній функції просто вивожу buf. Але все ж таки хотілося б дізнатися, як зробити по-нормальному, щоб функція зразу повертала рядок.

Теж один із варіантів, але недоліком такого підходу є те, що повернутий рядок затреться новим значенням при повторному виклику функції. Локальну знінну типу char[n] повертати не можна: після завершення функції область пам'яті, де лежала ця змінна, буде заміщуватись іншими даними. Можна у функції виділяти пам'ять з допомогою new (C++) чи malloc (C) — див. приклад вище. Або ж можна зробити буфер для рядка додатковим параметром функції (тоді про виділення пам'яті для нього треба потурбуватися в місці, де ця функція викликається):

char* to2(int num, char* bin)
{ 
strcpy(bin, "");
...
return bin;
}

int main()
{
char bin[15];
...
cout<<to2(num, bin);
}
Подякували: anakin, leofun013

6

Re: Повернення рядка

Повернути зі стеку можна, але результат треба швиденько скопіювати до фінального буферу (оминаючи виклики будь-яких інших функцій).

#include <stdio.h>
#include <stdint.h>


uint8_t *d2b(uint32_t n)
{
    uint8_t b[33] = { 0 };

    for (size_t i = 0; i < 32; b[32 - i++ - 1] = (n & 1) + '0', n >>= 1);

    return b;
}


int main(void)
{
    uint8_t b[33],
            *t1 = b,
            *t2 = d2b(1234);

    while (*t1++ = *t2++);  // замість memcpy, бо він потре нам рез-т

    printf("%s\n", b);

    return 0;
}

тобто

#include <stdio.h>
#include <stdint.h>

void a(void)
{
    uint8_t b[4];
    memcpy(b, "str", 4);
}

void b(void)
{
    uint8_t b[4];
    printf("%s\n", b);
}

int main(void)
{
    a();

    b();             // "str"
    b();             // "str"
    b();             // "str"
    putchar('X');    // тут затираються дані попереднього використання
    b();             // сміття

    return 0;
}
Подякували: 0xDADA11C7, leofun013

7

Re: Повернення рядка

але результат треба швиденько скопіювати до фінального буферу (оминаючи виклики будь-яких інших функцій).

А якщо саме в цей момент станеться апаратне переривання?

8 Востаннє редагувалося anakin (24.04.2016 21:43:17)

Re: Повернення рядка

Це не є адекватною практикою програмування, самі розумієте, тому обдумувати обробку помилок вважаю зайвим. Приклади несуть навчальний характер, задля розуміння стекової пам'яті. Слово "швиденько" там не потрібне.