• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Slownik c++ problem

Object Storage Arubacloud
0 głosów
862 wizyt
pytanie zadane 22 lutego 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)

dopiero dzisiaj odkrylem nowy kontener std::map no i probuje zrobic zadanie przy jego uzyciu, lecz nie dziala poprawnie.

void loadChars(std::map<std::string,char>&chars)
{
    chars["??="]='#';
    chars["??"+(char)42]=(char)92;
    chars["??'"]='^';
    chars["??("]='[';
    chars["??)"]=']';
    chars["??!"]='|';
    chars["??<"]='{';
    chars["??>"]='}';
    chars["??-"]='~';
}
std::string changeChars(std::string cod,std::map<std::string,char>chars)
{
    std::string tmp="",toReturn="";
    for(unsigned int i=0;i<cod.length();++i)
    {
        tmp+=cod[i];
        //std::cout<<tmp<<std::endl;
        if(tmp.length()>=3)
        {
            // tmp="??>"; // wtedy zadziala
            if(chars[tmp])toReturn+=chars[tmp];
            else toReturn+=tmp;
            tmp="";
        }
    }
    //std::cout<<toReturn;
    return toReturn;
}

if(chars[tmp]) zawsze zwraca false, a gdy sam przypisze wartosc to zwroci true.

komentarz 22 lutego 2017 przez vector Dyskutant (9,200 p.)
Playgound ✗ g++ -Wall -Wextra -Wshadow -Wformat=2 -Wfloat-equal -Wconversion -Wlogical-op -g3 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -fsanitize=address -std=c++14 xa.cpp -o xa
xa.cpp:4:12: warning: trigraph ??= converted to # [-Wtrigraphs]
     chars["??="]           = '#';
             
xa.cpp:6:12: warning: trigraph ??' converted to ^ [-Wtrigraphs]
     chars["??'"]           = '^';
             
xa.cpp:7:12: warning: trigraph ??( converted to [ [-Wtrigraphs]
     chars["??("]           = '[';
             
xa.cpp:8:12: warning: trigraph ??) converted to ] [-Wtrigraphs]
     chars["??)"]           = ']';
             
xa.cpp:9:12: warning: trigraph ??! converted to | [-Wtrigraphs]
     chars["??!"]           = '|';
             
xa.cpp:10:12: warning: trigraph ??< converted to { [-Wtrigraphs]
     chars["??<"]           = '{';
             
xa.cpp:11:12: warning: trigraph ??> converted to } [-Wtrigraphs]
     chars["??>"]           = '}';
             
xa.cpp:12:12: warning: trigraph ??- converted to ~ [-Wtrigraphs]
     chars["??-"]           = '~';
             
xa.cpp:35:31: warning: trigraph ??= converted to # [-Wtrigraphs]
     std::cout << changeChars("??=", chars) << std::endl;
                                
Playgound ✗ ./xa
=================================================================
==27835==ERROR: AddressSanitizer: global-buffer-overflow on address 0x00000040a06a at pc 0x7f1ec627bfb3 bp 0x7ffdc260db20 sp 0x7ffdc260d2c8
READ of size 1 at 0x00000040a06a thread T0
    #0 0x7f1ec627bfb2 in __interceptor_strlen /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_interceptors.cc:579
    #1 0x4038dd in std::char_traits<char>::length(char const*) /usr/include/c++/6.3.1/bits/char_traits.h:267
    #2 0x403f19 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) /usr/include/c++/6.3.1/bits/basic_string.h:456
    #3 0x402bc0 in loadChars(std::__debug::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, char> > >&) /home/vector/Programming/Playgound/xa.cpp:5
    #4 0x403587 in main /home/vector/Programming/Playgound/xa.cpp:34
    #5 0x7f1ec561e290 in __libc_start_main (/usr/lib/libc.so.6+0x20290)
    #6 0x402a39 in _start (/home/vector/Programming/Playgound/xa+0x402a39)

0x00000040a06a is located 39 bytes to the right of global variable '*.LC2' defined in 'xa.cpp' (0x40a040) of size 3
  '*.LC2' is ascii string '??'
0x00000040a06a is located 22 bytes to the left of global variable '*.LC3' defined in 'xa.cpp' (0x40a080) of size 2
  '*.LC3' is ascii string '^'
SUMMARY: AddressSanitizer: global-buffer-overflow /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_interceptors.cc:579 in __interceptor_strlen
Shadow bytes around the buggy address:
  0x0000800793b0: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
  0x0000800793c0: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
  0x0000800793d0: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
  0x0000800793e0: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9
  0x0000800793f0: 04 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9
=>0x000080079400: 02 f9 f9 f9 f9 f9 f9 f9 03 f9 f9 f9 f9[f9]f9 f9
  0x000080079410: 02 f9 f9 f9 f9 f9 f9 f9 02 f9 f9 f9 f9 f9 f9 f9
  0x000080079420: 02 f9 f9 f9 f9 f9 f9 f9 02 f9 f9 f9 f9 f9 f9 f9
  0x000080079430: 02 f9 f9 f9 f9 f9 f9 f9 02 f9 f9 f9 f9 f9 f9 f9
  0x000080079440: 02 f9 f9 f9 f9 f9 f9 f9 00 00 00 00 01 f9 f9 f9
  0x000080079450: f9 f9 f9 f9 00 00 00 00 00 00 f9 f9 f9 f9 f9 f9
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Heap right redzone:      fb
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack partial redzone:   f4
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==27835==ABORTING
Playgound ✗ 

No... jak widać chociażby po samych ostrzerzeniach od kompilatora musisz uciec(?) (escape) od trójznaków i powinno być dobrze.

 

btw

std::string changeChars(std::string cod,std::map<std::string,char>chars)

Dlaczego nie przekazujesz mapy jako referencji ?

komentarz 22 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)
no ok, tzn ze bd musial inaczej zrobic to zadanie.

Bo i tak jej nie modyfikuje

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 81 wizyt
pytanie zadane 30 stycznia 2020 w Offtop przez tresvitae Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 327 wizyt
pytanie zadane 14 grudnia 2018 w C i C++ przez Krystek102 Bywalec (2,440 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...