Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2014, 11:03   #21
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Нашел вариант, 3 варианта. все рабочие. Но говорят что лучше использовать двойной snprintf() что бы точно было.

вот такой

Код:
    char *buf;
    size_t sz;

     sz = snprintf(NULL, 0, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
     buf = (char *)malloc(sz + 1); 
     snprintf(buf, sz+1, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);

Код:
    char *sqlAnswers = 8;
    sprintf(sqlAnswers, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
Код:
    unsigned char *sqlAnswers;
    sprintf(sqlAnswers, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 17.08.2014 в 11:14.
pompiduskus вне форума Ответить с цитированием
Старый 17.08.2014, 11:41   #22
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Второй вариант, как и третий ваще работать не должен. Там undefined behaviour.

Первый может работать, но не забудь память освободить, иначе она быстро кончится xD
rrrFer вне форума Ответить с цитированием
Старый 17.08.2014, 12:00   #23
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Я вот так сделал. Проверил работает. А почему если я ' * ' не ставлю перед return, то оно мне ошибку выдает ?

Я видел два варианта удаления переменной, free() и delete() кажется. Тут наверное без разници да ?

Извини что я тебя мучаю =).

Код:
// #####################################################################
int main(int argc, char *argv) {
    //char* x = malloc(32);
    //printf("%s",get_md5("aaa"));
    //printf("%x",x);
    return 0;
}
// #####################################################################
get_md5(char* n){

    char* msg = n;
    size_t len = strlen(msg);
    md5((uint8_t*)msg, len);
    uint8_t *p;
    p=(uint8_t *)&h0;
// --------------------------------------------------------
    char* A_a = malloc(8);
    char* A_b = malloc(8);
    char* A_c = malloc(8);
    char* A_d = malloc(8);
// --------------------------------------------------------
        p=(uint8_t *)&h0;    
    sprintf(A_a, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
        p=(uint8_t *)&h1;    
    sprintf(A_b, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
        p=(uint8_t *)&h2;    
    sprintf(A_c, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
        p=(uint8_t *)&h3;    
    sprintf(A_d, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
// --------------------------------------------------------
    char* res = malloc(32);
    
    res = strcat(A_a, A_b);
    res = strcat(res, A_c);
    res = strcat(res, A_d);
    // --------------------------------------------------------
    //printf(res);
    //free(A_a); free(A_b); free(A_c); free(A_d);
// --------------------------------------------------------------
    //printf("%s",res);
    //return 0;
    //const char* get = res; 
    //return res;
}
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 17.08.2014 в 12:37.
pompiduskus вне форума Ответить с цитированием
Старый 17.08.2014, 12:08   #24
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Нет, не получается скинуть память. Написано что это только для динамических переменых. А если я создал переменые методом malloc() то они такими не являются ? я же указал размер.

Или я бред несу. Совсем запутался.

=====================
И переменную в виде строки тоже не получается вернуть. Звезда " *" просто ошибку не выдавала.

Пробовал, по разному. Кто то пише что нужно вот так а кто то еще как. И ничего из этого не работает !

Код:
    return const char*  res; 
    return char*  res; 
    return *res; 
    const char* res;
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 17.08.2014 в 12:40.
pompiduskus вне форума Ответить с цитированием
Старый 17.08.2014, 13:13   #25
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Я видел два варианта удаления переменной, free() и delete() кажется. Тут наверное без разници да ?
malloc - free, new - delete и не стоит их перемешивать

Код:
// #####################################################################
get_md5(char* n){
Раз вы не указали возвращаемый тип, то по умолчанию подразумевается int (Это верно для старых компиляторов, по новым стандартам так нельзя и компилятор вас поругает)

Последний раз редактировалось p51x; 17.08.2014 в 13:16.
p51x вне форума Ответить с цитированием
Старый 17.08.2014, 15:40   #26
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Перепробовал, наверное все что можно! Нехера не получается. Вообще заЪЪЪся.
Прочитал наверное сто форумов.

Все говорят что нужно делать вот так. Если функ. должна вернуть строку то так.

У всех работает у меня нет. Да еще и ругается, мол что то ей там не нравится. Это компилер онлайн который. Мой GCC под Debian wheezy. не матерится.

Единственный вариант который хоть заработатл это вот этот.

Ребята помогите, что я дурак не так делаю.

С маллоком без него, и так и сяк и все значения как char[] и как char* и char[]*

Код:
// варианты которые перепробовал
// -------------------------------------------------------
char* foo(char* n){
    // чтонить сделать.
    char* x = " aaaaa bbbbb ccccc ddddd";
    return x;
}
// -------------------------------------------------------
char* foo(char* n){
    // чтонить сделать.
    char[]* x = " aaaaa bbbbb ccccc ddddd";
    return x;
}
// -------------------------------------------------------
char[]* foo(char* n){
    // чтонить сделать.
    char[]* x = " aaaaa bbbbb ccccc ddddd";
    return x;
}
// -------------------------------------------------------
char[] foo(char* n){
    // чтонить сделать.
    char[] x = " aaaaa bbbbb ccccc ddddd";
    return x;
}
Этот рабочий, но мне нужно что бы он вернул значение а не вывел его.

Код:

int main(int argc, char *argv) {
    get_md5("aaa");
    return 0;
}

// --------------------------------
int get_md5(char *n){
    if(strlen(n) < 1 ){
        printf("===error===");
        return 0;
    }
    char *msg = n;
    size_t len = strlen(msg);
    md5((uint8_t*)msg, len);
    uint8_t *p;
// --------------------------------------------------------
    char *A_a = malloc(8);
    char *A_b = malloc(8);
    char *A_c = malloc(8);
    char *A_d = malloc(8);
// --------------------------------------------------------
        p=(uint8_t *)&h0;    
    sprintf(A_a, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
        p=(uint8_t *)&h1;    
    sprintf(A_b, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
        p=(uint8_t *)&h2;    
    sprintf(A_c, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
        p=(uint8_t *)&h3;    
    sprintf(A_d, "%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
// --------------------------------------------------------
    char *res = malloc(32);
    sprintf(res, "%s%s%s%s", A_a, A_b, A_c, A_d); 
// --------------------------------------------------------
    printf("%s\r\n",res);
    free(A_a); free(A_b); free(A_c); free(A_d);
    printf("%s\r\n",res);
// --------------------------------------------------------------
    return 0;
}
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 17.08.2014, 16:07   #27
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Это просто финиш !!!

Я хрен знает сколько часов сижу долбусь.
Причина была в том что я забыл ее задикларировать или как это называется когда функцию со всеми ее параметрами но без тела прописывают в начале документа.

Всем огромное спасибо! =)
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 17.08.2014, 16:58   #28
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Все варианты которые ты пробовал неправильные.
Код:
char* x = " aaaaa bbbbb ccccc ddddd";
Тут у тебя есть константа. Ты создаешь указатель на константу и потом этот указатель возвращаешь.
Но когда функция завершает работу константа разрушается и функция возвращает мусор.

Оно может сработать до поры до времени. Функция возвращает указатель на невыделенную область памяти, т.е. однажды комунибудь кусок этой памяти будет выделен и туда что-то будет записано. при этом твоя строка изменится.

Ошибку будешь искать очень долго. Это тоже undefined behaviour короче. Если твоя программа начнет "странно работать", про проблема может быть например тут.
rrrFer вне форума Ответить с цитированием
Старый 17.08.2014, 17:07   #29
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

А вот если я ее вынесу в глобальную область видемости но в самой функции буду ссылаться на extern char *res;

Тогда такой проблемы не будет ?

Я думал что это проблема решилась так как я вот это прописал

char *res = malloc(32);

Хотя этож логично, по завершению функции этот самый char *res = malloc(32); тоже перестает существовать.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 17.08.2014, 17:14   #30
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Хотя этож логично, по завершению функции этот самый char *res = malloc(32); тоже перестает существовать.
Нет, после завершения функции перестанет существовать указатель res, а память останется выделенной (вызовешь так функцию несколько раз и память вообще кончится). Я тебе писал про это выше, смотри сообщение #22.

Цитата:
А вот если я ее вынесу в глобальную область видемости но в самой функции буду ссылаться на extern char *res;
extern нужен если твоя переменная будет в нескольких единицах компиляции глобальной, а оно тебе надо? - я вообще не люблю etern, ИМХО это все ведет к трудноуловимым ошибкам. как и глобальные переменные вообще.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли в delphi md5 как в lazaruse, там достаточно подключить MD5 и считать хэш? Taner Общие вопросы Delphi 8 12.05.2014 08:38
код, который должен открывать файл, находить в нем определенный символ и заменять его на другой, не записывает в файл Dima-War Общие вопросы C/C++ 2 14.12.2013 21:35
сохранить текстовый файл, который загружен в мемо поле (загрузка файла- есть код) Делфи 7 программирование Помощь студентам 5 22.11.2013 07:17
Повторение javascript кода бесконечно! Есть код,хочу заставить его повторяться Viboxjuwin JavaScript, Ajax 5 11.10.2013 13:46
Возможна ли программа на Delphi, которая генерирует текст и постит его на сайт vindows93 Свободное общение 31 16.12.2011 22:33