Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возвращение массива строки, C++ 
V
    Опции темы
fuckerok
Дата 27.2.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



есть функция возрата строки:
Код

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
Подскажите, если вы меня поняли :]
--------------------
PM MAIL ICQ   Вверх
Romikgy
Дата 27.2.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
LPBOY
Дата 27.2.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(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;
}



--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
fuckerok
Дата 27.2.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



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

LPBOY

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

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


Это сообщение отредактировал(а) fuckerok - 27.2.2006, 18:33
--------------------
PM MAIL ICQ   Вверх
LPBOY
Дата 27.2.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Когда ты возвращаешь из функции указатель char*, то вся информация о размере массива уже теряется. Храни размер в отдельной переменной и передавай ее из функции, больше ничего не поделаешь...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Daevaorn
Дата 27.2.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



fuckerok,
тогда твоё спасение - std::vector. и не надо голову ломать и что-то изобретать.
PM MAIL WWW   Вверх
LPBOY
Дата 27.2.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



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

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

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

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

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
fuckerok
Дата 27.2.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



Код

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
--------------------
PM MAIL ICQ   Вверх
MAKCim
Дата 27.2.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



std::string


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Dov
Дата 27.2.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88




Код
#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;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dov
Дата 1.3.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(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;    
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Гоганчик
Дата 5.3.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.3.2006

Репутация: нет
Всего: нет



Вообще-то функция strlen () предназначена для Си строк, т.е. тех, у которых в конце 0х00. Если ты используешь нулевой терминатор где-то в серединке, то это уже не си строка. Как люди говорят, либо используй вектор, либо изобретай велосипед... Другого пути нет.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.