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

Podpowiedź, Tablica dwuwymiarowa string zbyt długa

Object Storage Arubacloud
0 głosów
742 wizyt
pytanie zadane 26 czerwca 2018 w C i C++ przez Programmererer Początkujący (260 p.)

Chciałem napisać program, który zmieni całe zdanie na emotki z discorda w kształcie odpowiadającym literze. Czyli a = :regional_indicator_a:, b = :regional_indicator_b:,.. itd. troche mnie przerosło więc zacząłem od wyrazu, zamiast zdań. Ale napotkałem problem odnośnie długości nazwy emotek w stringach w tablicy w drugim wymiarze, bo pierwszy wymiar działa.

#include <iostream>
#include <string>
#include <string.h>

using namespace std;
string znaki[2][52]={{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q','R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', },
                    {':regional_indicator_a:', ':regional_indicator_b:', ':regional_indicator_c:', ':regional_indicator_d:', ':regional_indicator_e:', ':regional_indicator_f:', ':regional_indicator_g:', ':regional_indicator_h:', ':regional_indicator_i:', ':regional_indicator_j:', ':regional_indicator_k:', ':regional_indicator_l:',':regional_indicator_m:',
                    ':regional_indicator_n:', ':regional_indicator_o:', ':regional_indicator_p:', ':regional_indicator_q:',':regional_indicator_r:', ':regional_indicator_s:', ':regional_indicator_t:', ':regional_indicator_u:', ':regional_indicator_v:', ':regional_indicator_w:', ':regional_indicator_x:', ':regional_indicator_y:', ':regional_indicator_z:',
                    ':regional_indicator_a:', ':regional_indicator_b:', ':regional_indicator_c:', ':regional_indicator_d:', ':regional_indicator_e:', ':regional_indicator_f:', ':regional_indicator_g:', ':regional_indicator_h:', ':regional_indicator_i:', ':regional_indicator_j:', ':regional_indicator_k:', ':regional_indicator_l:',':regional_indicator_m:',
                    ':regional_indicator_n:', ':regional_indicator_o:', ':regional_indicator_p:', ':regional_indicator_q:',':regional_indicator_r:', ':regional_indicator_s:', ':regional_indicator_t:', ':regional_indicator_u:', ':regional_indicator_v:', ':regional_indicator_w:', ':regional_indicator_x:', ':regional_indicator_y:', ':regional_indicator_z:'}};
string emotikowanie(string wyraz)
{
    string wyraz2 = wyraz;

    for(int i=0;i<wyraz.length();i++)
    {
    for(int n=0;n<52;n++)
        {
            if(wyraz[i]==znaki[0][n])
            {
                wyraz2[i] = znaki[1][n];
    break;
            }
        }
    }
    return wyraz2;
}

    int main()
{
    string wyraz;
    cout << "Podaj wyraz: ";
    cin>>wyraz;
    cout << emotikowanie(wyraz) << endl;

    return 0;
}

W tablicy są oczywiście powielone znaki aby zamieniało duże, jak i małe litery. Nie chcę żeby któreś z nich czuły się dyskryminowane przez kompilator ;) 

Po uruchomieniu sypie błędami z 2 wymiaru :D

Aby ominąć rozsypywanie się zastąpiłem typ tablicy na long, dzięki temu można sprawdzić czy działa cała reszta kodu, ale ze znikomym efektem zamiany liter :/

komentarz 27 czerwca 2018 przez j23 Mędrzec (194,920 p.)

Ta tablica wielowymiarowa jest zbędna

   char str[] = ":regional_indicator_ :";

    std::string wyraz1 = "ala ma kota";
    std::string wyraz2;
    
    for(auto c : wyraz1)
    {
        if(isalpha(c)) 
        {
            str[20] = tolower(c);
            wyraz2 += str;
        }
        else wyraz2 += c;
    }
    
    std::cout << wyraz2 << '\n';

 

2 odpowiedzi

+1 głos
odpowiedź 26 czerwca 2018 przez RafalS VIP (122,820 p.)
edycja 26 czerwca 2018 przez RafalS

Bo w C++ jest różnica między pojedynczymi cudzyslowami 'a' oraz podwójnymi "a". Typ pierwszego to char, drugiego to const char* (tablica charów).

':regional_indicator_a:'

coś takiego się nigdy nie skompiluje. Podobnie jak:

string s = 'a';

EDIT: Gdy pozamieniasz już pojedyńcze cudzysłowy na podwójne w tablicy znaki to napotkasz problem w tej linijce:

if(wyraz[i]==znaki[0][n])

Gdyż będziesz próbował porównywać znak ze stringiem. Odwołaj się więc do zerowego elementu jedno-elementowego stringa.

komentarz 26 czerwca 2018 przez Programmererer Początkujący (260 p.)
Okej w sumie to masz rację. Tylko nadal nie wiem jak to rozwiązać :/ Co sądzisz o 2 tablicach jednowymiarowych(jedna char, a druga const char*) przejdzie to czy nie?
komentarz 26 czerwca 2018 przez Programmererer Początkujący (260 p.)
{{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q","R", "S", "T", "U", "V", "W", "X", "Y", "Z", },
                    {":regional_indicator_a:", ":regional_indicator_b:", ":regional_indicator_c:", ":regional_indicator_d:", ":regional_indicator_e:", ":regional_indicator_f:", ":regional_indicator_g:", ":regional_indicator_h:", ":regional_indicator_i:", ":regional_indicator_j:", ":regional_indicator_k:", ":regional_indicator_l:",":regional_indicator_m:",
                    ":regional_indicator_n:", ":regional_indicator_o:", ":regional_indicator_p:", ":regional_indicator_q:",":regional_indicator_r:", ":regional_indicator_s:", ":regional_indicator_t:", ":regional_indicator_u:", ":regional_indicator_v:", ":regional_indicator_w:", ":regional_indicator_x:", ":regional_indicator_y:", ":regional_indicator_z:",
                    ":regional_indicator_a:", ":regional_indicator_b:", ":regional_indicator_c:", ":regional_indicator_d:", ":regional_indicator_e:", ":regional_indicator_f:", ":regional_indicator_g:", ":regional_indicator_h:", ":regional_indicator_i:", ":regional_indicator_j:", ":regional_indicator_k:", ":regional_indicator_l:",":regional_indicator_m:",
                    ":regional_indicator_n:", ":regional_indicator_o:", ":regional_indicator_p:", ":regional_indicator_q:",":regional_indicator_r:", ":regional_indicator_s:", ":regional_indicator_t:", ":regional_indicator_u:", ":regional_indicator_v:", ":regional_indicator_w:", ":regional_indicator_x:", ":regional_indicator_y:", ":regional_indicator_z:"}};

łap tu pozmieniane cudzysłowie 

komentarz 26 czerwca 2018 przez RafalS VIP (122,820 p.)
Gdybym ja to pisał to zrobiłbym mape litera : string, ale pewnie o nich nie słyszałeś i na razie nie chcesz słyszeć :P.

Najprostsze rozwiązanie to poprawa tego które jest, czyli trzymasz tablice stringów, i w przypadku stringów złożonych z pojedynczej litery robisz znaki[i][j][0]
komentarz 26 czerwca 2018 przez Programmererer Początkujący (260 p.)

@RafalS, Ciężko mi to sobie wyobrazić, bo [0][n] już się odwołuje do zerowego elementu jedno-elementowych stringów. Po prostu nie rozumiem :c Ale dzieki za pomoc :D Doceniam

komentarz 26 czerwca 2018 przez RafalS VIP (122,820 p.)
Masz tablicę dwuwymiarową stringów, czyli poniekąd tablice trójwymiarową.

znaki - tablica tablic tablic znaków (stringów)

znaki[0] - tablica tablic znakow(stringów)

znaki[0][0] - tablica znakow (string)

znaki[0][0][0] - znak
komentarz 26 czerwca 2018 przez Programmererer Początkujący (260 p.)

@RafalS, czyli 3 wymiary? 

komentarz 26 czerwca 2018 przez RafalS VIP (122,820 p.)

Poniekąd tak. Tablica 2d stringów. A każdy string jest tablicą znaków. Gdybyś miał zwykłą tablice stringów:

string tab[2] = {"no","elo"};

to tab[0] to cały string "no", a tab[0][0] to znak 'n'. Przesklauj to sobie do dwuwymiarowej i masz 3 wymiary :P

komentarz 26 czerwca 2018 przez Programmererer Początkujący (260 p.)
Nie no to ja się poddaje. Nie rozumiem :c. Myślałem że będzie jakaś zmienna long string/string long, albo biblioteka na takie coś, a tu 3 wymiary i  głowa mała :/
komentarz 26 czerwca 2018 przez RafalS VIP (122,820 p.)
No jak? Masz string s = "abcd". Który jest poniekąd tablicą znaków w takim sensie, że możesz na stringu zrobić s[1] i dostaniesz 'b' w tym przypadku. Jeśli zrobisz tablicę stringów to każdy element tej tablicy będzie stringiem, całym napisem, a to znaczy ze będzie tablicą napisów. Wiec string tab[2] = {"pierwszy string", "drugi string"}; tab[0] to "pierwszy string", na którym mozna użyć kwadratowych nawiasów jeszcze raz i dobrać się do pojedyńczych literek.

tab[0] zwraca Ci to co jest pierwszym elementem tej tablicy, może to być liczba, znak, ale może też być kolejna tablica. Możesz sobie to zapisać z nawiasami moze wtedy będzie czytelniejsze: (tab[0])[0], z wyniku wyciągniecia pierwszego elementu tablicy wyciągamy pierwszy element.
0 głosów
odpowiedź 26 czerwca 2018 przez mokrowski Mędrzec (156,060 p.)
Jeśli nie znasz kontenera std::map / std::unordered_map, to zrób po prostu 2 tablice. W jednej będziesz trzymał litery a w drugiej (w kolejności liter), opisy emotikonów. Teraz szukając danej litery, otrzymasz indeks który będzie pasował także do 2 tablicy z emotikonami. Oprócz tego że oczywiście algorytm nie będzie optymalny (bo szukanie jest liniowe), masz prosty program do ogarnięcia i zrozumienia. A nie "n-wymiarowy matrix" :)

Zasada KISS :)

Podobne pytania

+1 głos
4 odpowiedzi 4,690 wizyt
pytanie zadane 14 września 2015 w C i C++ przez Wojtek Wiedeński Bywalec (2,460 p.)
0 głosów
1 odpowiedź 429 wizyt
pytanie zadane 11 grudnia 2022 w C i C++ przez polandonion Mądrala (7,090 p.)
0 głosów
1 odpowiedź 760 wizyt

92,632 zapytań

141,500 odpowiedzi

319,878 komentarzy

62,012 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!

...