Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > возвращение массива строки


Автор: fuckerok 27.2.2006, 17:47
есть функция возрата строки:
Код

char* f() 

 static char result[] = "helloworld"; 
return result; 

int main()
{
char* str = f();
 cout << str << sizeof(str);
}


При такой функции строка выводится как надо, но sizeof(str) = 4 байта. (долго думал почему 4... только догадки)
А мне нужно от sizeof(str) получить 10 байт (строка "helloworld" = 10 байтам)
Конечно можно воспользоватся strlen, скажете вы, но этот способ мне не подходит потому-что strlen как я понял игнорирует символы типа 0x00 и тд, а мне это очень важно.

Вообщем нужно возрвратить строки таким способом (или приобразовать её уже поле возвращения), чтобы можно было потом с ней работать также, если бы я сам назначил char str[] = "helloworld";

Никак не могу разобратся с этими указателями smile
Подскажите, если вы меня поняли :]

Автор: Romikgy 27.2.2006, 17:53
Цитата(fuckerok @ 27.2.2006, 16:47 Найти цитируемый пост)
sizeof(str) = 4 байта.

это размер указателя
Цитата(fuckerok @ 27.2.2006, 16:47 Найти цитируемый пост)
А мне нужно от sizeof(str) получить 10 байт (строка "helloworld" = 10 байтам)

strlen(str);
Цитата(fuckerok @ 27.2.2006, 16:47 Найти цитируемый пост)
игнорирует символы типа 0x00

он не игнорирует , а этот символ означает конец строки

Автор: LPBOY 27.2.2006, 18:19
Цитата(fuckerok @ 27.2.2006, 17:47 Найти цитируемый пост)
А мне нужно от sizeof(str) получить 10 байт (строка "helloworld" = 10 байтам)

11 байт
Цитата(fuckerok @ 27.2.2006, 17:47 Найти цитируемый пост)
strlen как я понял игнорирует символы типа 0x00 и тд, а мне это очень важно.

Хм... не очень удобно работать со строкой в которой есть 0x00... Зачем это тебе? ИМХО, лучше всего использовать strlen(), но если очень надо чтобы sizeof(str) давал размер массива, то могу предложить такое вот извращение:
Код

#include <iostream>

char (&f())[12]
{
    static char result[] = "hello world";
    return result;
}

int main(int argc, char *argv[])
{
    char (&arr)[12] = f();
    std::cout << sizeof(arr) << '\n';
    return 0;
}



Автор: fuckerok 27.2.2006, 18:24
Мне в любом случае нужно знать размер в байтах, поэтому strlen не подходит
А значение str[] = "helloworld"; взято мной как пример, оно может быть типа
char str[] = {0x0F, 0xFF, 0x00, 0xFF}; и тогда strlen не поможет.

LPBOY

Твой пример работает, но это частный случай с "hello world", на самом деле мы не знаем размер result (он приходит из космоса), следовательно не знаем сколько байт нужно выдилить функции для возвращения.

Я думаю можно как-нить указателями сделать: возвратить его и как-то приобразовать... (но я 4 дня в c++, поэтому как это сделать я не знаю)

Автор: LPBOY 27.2.2006, 18:29
Когда ты возвращаешь из функции указатель char*, то вся информация о размере массива уже теряется. Храни размер в отдельной переменной и передавай ее из функции, больше ничего не поделаешь...

Автор: Daevaorn 27.2.2006, 18:30
fuckerok,
тогда твоё спасение - std::vector. и не надо голову ломать и что-то изобретать.

Автор: LPBOY 27.2.2006, 18:47
Цитата(fuckerok @ 27.2.2006, 18:24 Найти цитируемый пост)
Твой пример работает, но это частный случай с "hello world", на самом деле мы не знаем размер result (он приходит из космоса), следовательно не знаем сколько байт нужно выдилить функции для возвращения.

Размер статического массива должен быть известен во время компиляции и из космоса он не может придти.

Цитата(fuckerok @ 27.2.2006, 18:24 Найти цитируемый пост)
Я думаю можно как-нить указателями сделать: возвратить его и как-то приобразовать...

Храни размер отдельно или используй в vector<char>, как уже сказали.

Автор: fuckerok 27.2.2006, 18:50
Код

char* f(int &size)
{
        static char result[] = "helloworld";
        size = sizeof(result);
        return result;
}
int main()
{
        int size = 0;
        char *p = f(size);
        char str[size];
        memcpy(&str, p, sizeof(str));
        cout << str <<" " << sizeof(str);
}

Не нравится мне этот memcpy, но вроде всё работает.

Daevaorn, std::vector мы ещё не проходили smile + я люблю минимализм.

all
Спасибо товарищи, очень оперативно работаете. smile

Автор: MAKCim 27.2.2006, 19:12
std::string

Автор: Dov 27.2.2006, 21:40

Код
#include <iostream.h>
#include <string.h>
#include <malloc.h>

char* f()    
{    
    static char result[] = "helloworld";    
    char* p = new char[sizeof(result)];
    strcpy(p, result);
        
    return p;    
}

void main()
{
    char* str = f();    
    cout << str << " " << _msize(str);

    delete[]str;
}

Автор: Dov 1.3.2006, 16:04
Цитата(fuckerok @ 27.2.2006, 17:50 Найти цитируемый пост)
Не нравится мне этот memcpy, но вроде всё работает.

Как это может работать, ума не приложу.
Цитата(fuckerok @ 27.2.2006, 17:50 Найти цитируемый пост)
Код
int main()    
{    
        int size = 0;    
        char *p = f(size);    
        char str[size];    
        memcpy(&str, p, sizeof(str));    
        cout << str <<" " << sizeof(str);    
}



Можно ещё так попробовать
Код
#include <iostream.h>    
#include <string.h>    
#include <malloc.h>
    
char* f()     
{     
    static char result[] = "helloworld";    
    return result;     
}
    
void main()    
{    
    char* str = new char[sizeof(char) * strlen(f()) + 1];
    strcpy(str, f());    
    cout << str << " " << _msize(str);
    
    delete[]str;    
}


Автор: Гоганчик 5.3.2006, 14:00
Вообще-то функция strlen () предназначена для Си строк, т.е. тех, у которых в конце 0х00. Если ты используешь нулевой терминатор где-то в серединке, то это уже не си строка. Как люди говорят, либо используй вектор, либо изобретай велосипед... Другого пути нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)