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

C++ - błąd związany z transform(...)

VPS Starter Arubacloud
–1 głos
190 wizyt
pytanie zadane 10 lutego 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)

Witam bajecznie,

otóż nie potrafię już sobię poradzić samemu, głowię się nad pewnym błędem, a dokładniej polega on na tym, że używając linii kodu 

transform(odp.begin() odp.end() odp.begin(), ::toupper);

kompilator wywala mi błąd "no matching function for call to 'transform(std::__cxx11::basic_string<char>::i..."

jakiś spec może wie o co chodzi i poratowałby odpowiedzią? Byłbym niezmiernie wdzięczny, bo tracę już zmysły...

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>


using namespace std;

string odp;

int ile;

int main()
{
    setlocale( LC_ALL, "" );

    fstream plik;
    plik.open("odpowiedzi.txt", ios::out);
    if(plik.good()==false) cout << "Nie można odtworzyć pliku.";

    cout << "Ile odpowiedzi masz zamiar udzielić?";
    cin >> ile;

    int* tablica;
    tablica= new int [ile];

    for (int i=0; i<ile; i++)
    {
        cout << i+1 << ". ";


        ponownaodpowiedz:
        cin >> odp;

        if(odp!="a" && odp!="b" && odp!="c" && odp!="A" && odp!="B" && odp!="C") {cout << "Nie ma takiej odpowiedzi, wybierz ją ponownie: "; goto ponownaodpowiedz;}

        transform(odp.begin() odp.end() odp.begin(), ::tolower);

        plik << i+1 << ". " << odp << endl;
    }
    plik.close();

    return 0;
}

? Ja już tracę zmysły...

komentarz 10 lutego 2020 przez DragonCoder Nałogowiec (36,500 p.)
edycja 10 lutego 2020 przez DragonCoder
A przecinki to zjadles z glodu? :P

https://en.cppreference.com/w/cpp/algorithm/transform

nie chcesz uzyc moze

http://www.cplusplus.com/reference/locale/toupper/

Zeby zmienic wszystkie na wielkie litery?

I co to za goto?
komentarz 11 lutego 2020 przez j23 Mędrzec (195,220 p.)

@Nabuchadonozor,

Ja już tracę zmysły...

Chyba tak - używasz goto tam, gdzie spokojnie można użyć pętli do...while, wywołujesz std::transform w sumie nie wiadomo po co.

komentarz 11 lutego 2020 przez Nabuchadonozor Gaduła (3,120 p.)

@DragonCoder, dzięki wielkie za pomoc! Od wczoraj staram się zrobić to z tym co mówisz, ale nie mogę ogarnąć tego, ciężko zrozumieć mi coś z tej biblioteki <locale>. Znajdę jakieś poradniki i ogarnę to, bo widzę kilka innych ciekawych funkcji w niej :D A teraz się zabiore za zamienienie goto na po prostu pętle do ... while zamiast for. Miłego!

komentarz 11 lutego 2020 przez Nabuchadonozor Gaduła (3,120 p.)

@j23, funkcja transform() jest po to, by zamieniła mi litery nie ważne jakie będą wpisane -> na duże. Zlecenie przez nauczyciela takie było, bo on potrzebuje tego, żeby wpisując na szybko, nie trzeba było odpalać capsa czy trzymać shifta, program przeciez to może sam zrobić. A jeszcze nie napisałem, duże litery są czytelniejsze dla oka, jeśli ich jest 40. Podczas robienia tego w pętli do ... while, nie będę miał możliwości tak prostego skodzenia tego programu. Czysty juz zrobiony kodzik taki jaki powinien być dołączam na wszelki.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <conio.h>

using namespace std;

string odp;
int ile;

int main()
{
    setlocale( LC_ALL, "" );

    fstream plik;
    plik.open("odpowiedzi.txt", ios::out);
    if(plik.good()==false) cout << "Nie mo¿na odtworzyæ pliku.";

    cout << "Ile odpowiedzi masz zamiar udzieliæ?: ";
    cin >> ile;

    int* tablica;
    tablica= new int [ile];

    for (int i=0; i<ile; i++)
    {
        cout << i+1 << ". ";


        ponownaodpowiedz:
        cin >> odp;

        if(odp!="a" && odp!="b" && odp!="c" && odp!="A" && odp!="B" && odp!="C") {cout << "Nie ma takiej odpowiedzi, wybierz j¹ ponownie: "; goto ponownaodpowiedz;}

        transform(odp.begin(), odp.end(), odp.begin(), ::toupper);

        plik << i+1 << ". " << odp << endl;
    }
    plik.close();

    cout << "Czas programu dobieg³ koñca.." << endl << endl << "KLIKNIJ DOWOLNY KLAWISZ, ABY WY£¥CZYÆ PROGRAM";


    _getch();
    return 0;
}

 

komentarz 11 lutego 2020 przez j23 Mędrzec (195,220 p.)

Nie musisz mi tłumaczyć, co robi std::transform, tylko ja nie widzę sensu wywołania tej funkcji w twoim kodzie. Jakbyś zrobił tak:

while (std::cin >> odp) {
    std::transform(odp.begin(), odp.end(), odp.begin(), ::toupper);
    if (odp == "A" || odp == "B" || odp == "C") break;
    std::cout << "Nie ma takiej odpowiedzi, wybierz ja ponownie: ";
}

to co innego.

komentarz 12 lutego 2020 przez Nabuchadonozor Gaduła (3,120 p.)
@j23, aaa o to Ci chodziło, a szczerze Ci powiem, że nie pomyślałem o takim użyciu jego. Dzięki za pomoc!

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

Podobne pytania

0 głosów
1 odpowiedź 348 wizyt
pytanie zadane 13 października 2020 w C i C++ przez mccarol Nowicjusz (240 p.)
0 głosów
1 odpowiedź 144 wizyt
pytanie zadane 24 marca 2022 w C i C++ przez Andrzej Hnatiuk Początkujący (350 p.)
+1 głos
2 odpowiedzi 219 wizyt
pytanie zadane 22 listopada 2021 w HTML i CSS przez Billy Użytkownik (680 p.)

92,947 zapytań

141,899 odpowiedzi

321,118 komentarzy

62,283 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...