Java týden
Procvič si angličtinu zdarma s naším americkým e-learningem! Learn more
Pouze tento týden sleva až 80 % na celý Java e-learning!
Avatar
Wolf
Člen
Avatar
Wolf:6. března 20:37

Nic.

Zkusil jsem: Nic.

Chci docílit: Snazim sa previest zadany text
char* text = "Hello world!"; do binarneho tvaru.

Odpovědět 6. března 20:37
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
Lukáš
Redaktor
Avatar
Odpovídá na Wolf
Lukáš:6. března 20:52

Zkus alespoň napsat, jak by jsi to řešil.. Když napíšeš, že jsi se ani nepokusil, tak ti tu většina ani radit nebude.. Takhle to (vypadá), že po někom chceš hotové řešení.

 
Nahoru Odpovědět 6. března 20:52
Avatar
Wolf
Člen
Avatar
Wolf:6. března 20:53

Asi takto len neviem čo s tím dalej ze ako dam text char to intu?

(const char* text){
    if(text == NULL)
        return NULL;
    int size = strlen(text);
    int binaryNum[8];
    char copy_text;
    strcpy(copy_text,text);
Editováno 6. března 20:54
Nahoru Odpovědět 6. března 20:53
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:6. března 21:39

To si tomu moc nedal. Tvé řešení nemá hlavu ani patu. Chybně je úplně vše (od deklarace proměnných, ukončení bloku, použití správného argumentu funkce, a mnoho dalších).

Řešením je vytvoření funkce převádějící znak do jeho binární podoby a provést traversing (Tuto funkci aplikovat postupně na všechny znaky v daném řetezci).

#include <stdio.h>

void ch_to_bin(unsigned char c);

int main(void) {
        unsigned char str[] = "Hello world!";
        unsigned char *pstr = str;

        while (*pstr) ch_to_bin(*pstr++);

        return 0;
}

void ch_to_bin(unsigned char c) {
        int i;

        for (i = 7; i >= 0; i--) putchar((c & (1 << i)) ? '1' : '0');
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 6. března 21:39
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Wolf
Člen
Avatar
Odpovídá na DarkCoder
Wolf:6. března 22:02

Nechápem čo robí to ta premenná c?

Nahoru Odpovědět 6. března 22:02
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:6. března 22:27

Proměnná c je formálním parametrem funkce ch_to_bin(), jejíž účelem je předat funkci znakový argument. Ten je získáván pomocí dereference ukazatele na znak, který obsahuje postupně adresy všech znaků ve vstupním řetězci.

Nahoru Odpovědět 6. března 22:27
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Wolf
Člen
Avatar
Odpovídá na DarkCoder
Wolf:7. března 6:01

Ok len aby sme sa pochopili.Program ,ktorý mám urobiť je takto je definovaná funkcia v ktorej má bežať daný kód na zmenu char do bin.Main je ukažkovy ,že ako sa vyplňa. ta funkcia.

unsigned char* bit_encrypt(const char* text){

}
int main(){
        char* encrypted;
        encrypted = bit_encrypt("Hello world!");
}
Editováno 7. března 6:01
Nahoru Odpovědět 7. března 6:01
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:7. března 20:35

Pokud chceš s binární reprezentací řetězce dále pracovat, musíš ji někam uložit. Tedy alokuješ si prostor, aby se do něj vešla binární reprezentace celého řetězce. Poté binární reprezentaci každého znaku postupně ukládáš do tebou alokované paměti. Nakonec vrátíš z funkce ukazatel na začátek alokované paměti, což představuje začátek řetězce zapsaném v binární podobě. Vrácený ukazatel přiřadíš jinému ukazateli. Vypíšeš řetězec pomocí ukazatele a nakonec uvolníš alokovanou paměť.

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned char *str_to_bin(unsigned char *s);

int main(void) {
        unsigned char str[] = "Hello World!";
        unsigned char *p_binstr = NULL;

        p_binstr = str_to_bin(str);

        puts(p_binstr);

        free(p_binstr);

        return 0;
}


unsigned char *str_to_bin(unsigned char *s) {
        unsigned char *strbuff = NULL;
        unsigned char *p_str = s;
        int i, pos = 0;

        strbuff = (unsigned char *)malloc(CHAR_BIT * strlen(s) + 1);
        if (!strbuff) {
                fprintf(stderr, "Chyba alokace pameti.\n");
                exit(1);
        }

        while (*p_str) {
                for (i = 7; i >= 0; i--, pos++) {
                        *(strbuff + pos) = ((*p_str & (1 << i)) ? '1' : '0');
                }
                p_str++;
        }
        *(strbuff + pos) = '\0';

        return strbuff;
}

Můžeš si zachovat (lehce poupravit) funkci pro získání binární reprezentace znaku a tuto funkci používat pro funkci provádějící převod celého řetězce do binární podoby. Přístup bys pak prováděl pomocí ukazatele na funkci použitého jako argument funkce. Z důvodu efektivity je funkce převodu znaku do jeho binární podoby přímo implementována do funkce pracující s řetězcem.

Nahoru Odpovědět 7. března 20:35
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Wolf
Člen
Avatar
Odpovídá na DarkCoder
Wolf:8. března 18:30

Velmi pekne dakujem za pomoc. Mam otazku co robi ta funkcia CHAR_BIT?

Nahoru Odpovědět 8. března 18:30
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:8. března 19:18

CHAR_BIT je makro, nikoli funkce. Je definováno v knihovně limits.h a vyjadřuje z kolika bitů se byte skládá. Ne všechny architektury pracují v systému 1 byte = 8 bits.

Nahoru Odpovědět 8. března 19:18
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:8. března 19:26

Program ovšem pracuje správně tam kde 1byte = 8 bits. Což je vidět z počtu iterací cyklu for.

Nahoru Odpovědět 8. března 19:26
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.