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

Konwersja char -> string

Object Storage Arubacloud
0 głosów
1,634 wizyt
pytanie zadane 14 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
edycja 14 października 2017 przez criss
Hej,

W jaki sposób mogę pojedynczy znak zmienić w stiringa wewnątrz pętli ?

mam problem w konwertowaniem chyba wszystkich typów, jest jakaś złota metoda lub chociaż ściągawka  ?

Z góry dziękuje za pomoc ;) Miłego wieczora ;;)

3 odpowiedzi

0 głosów
odpowiedź 14 października 2017 przez draghan VIP (106,230 p.)
wybrane 15 października 2017 przez Shiro
 
Najlepsza

Cześć, Shiro.

W jaki sposób mogę pojedynczy znak zmienić w stiringa wewnątrz pętli ?

Nie da rady "zamienić" jednego typu w inny. Możesz jedynie tworzyć obiekty pewnego typu na podstawie obiektów innego typu. I tak, żeby utworzyć obiekt std::string z typu char, możesz użyć jednego z konstruktorów:

char character{'c'};
std::string s{character};

mam problem w konwertowaniem chyba wszystkich typów, jest jakaś złota metoda lub chociaż ściągawka  ?

Do konwersji na typ std::string możesz wykorzystać funkcję std::to_string, która jest przeciążona dla typów wbudowanych.

komentarz 14 października 2017 przez Shiro Stary wyjadacz (10,300 p.)

Widziałem to rozwiązanie na stacku jednak przy próbie użycia tego w pętli dla mnie traci to sens. 

Będzie łatwiej z kodem: 

	const string data = "YMDHND", support;

	for (int i = 0; i < data.length(); i++)
	{
		support = support(1, data[i]);
		timeNow[i] = TimeSignature(support);
	}

No i tak jak pisałem niżej linia 1sza wewnątrz fora wydaje się generować błąd

call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type

Ale oczywiście dziękuje Ci za pomoc ;) Miłego dnia. Shiro!

komentarz 14 października 2017 przez draghan VIP (106,230 p.)

Jakiś chochlik (pozdrawiam chochlika ;) mi się niecnie wkradł - chciałem żeby tutaj było wykorzystanie konstruktora z std::initializer_list<char>, czyli bez tej jedynki przez zmienną znakową (spójrz raz jeszcze na odpowiedź). ;)

Odrobinę nie rozumiem, co próbujesz osiągnąć.

Tak?

const string data = "YMDHND";
for (int i = 0; i < data.length(); i++)
{
    timeNow[i] = TimeSignature({data[i]});
}

A może tak?

const string data = "YMDHND";
string support;
 
for (int i = 0; i < data.length(); i++)
{
    support += data[i];
    timeNow[i] = TimeSignature(support);
}

 

komentarz 15 października 2017 przez Shiro Stary wyjadacz (10,300 p.)
Pierwsza wersja, działa i dziękuje jednak nie bardzo rozumiem co tutaj się stało ;(

Prawdopodobnie ma to związek z obiektowością, ja nie potrafię tego zrozumieć. Planuje przypomnieć sobie kurs Pana MZ, ale czy polecasz jakieś inne publikację na temat obiektowego c++ dla początkujących ?

Dziękuje Ci za pomoc i miłego dnia życzę ;)
komentarz 15 października 2017 przez draghan VIP (106,230 p.)

Pierwsza wersja, działa i dziękuje jednak nie bardzo rozumiem co tutaj się stało ;(

Domniemałem że funkcja TimeSignature() oczekuje na parametr typu std::string. Tak więc trzeba jej przekazać obiekt typu std::string. Wykorzystałem tutaj fakt, że zapis klamerkowy może być od C++11 interpretowany jako std::initializer_list oraz użyłem konstruktor numer 9 klasy std::string. Mogło to wyglądać w ten sposób:

const string data = "YMDHND";
for (int i = 0; i < data.length(); i++)
{
    timeNow[i] = TimeSignature(std::string{data[i]});
}

Ale wykorzystałem również fakt, że możliwa jest niejawna konwersja z std::initializer_list<> do std::string - konstruktor (9) dopuszcza podanie tylko jednego argumentu i nie jest oznaczony jako explicit, więc możliwy jest zapis:

const string data = "YMDHND";
for (int i = 0; i < data.length(); i++)
{
    timeNow[i] = TimeSignature({data[i]}); // jako argument podaję std::initializer_list<char>, które jest niejawnie konwertowane na std::string
}

Planuje przypomnieć sobie kurs Pana MZ, ale czy polecasz jakieś inne publikację na temat obiektowego c++ dla początkujących ?

Mówiąc szczerze, to średnio u mnie ze znajomością książek dla początkujących. Słyszałem że "Programowanie. Teoria i praktyka z wykorzystaniem C++" Stroustrupa jest wcale niezłe, ale nie mogę potwierdzić, bo nie czytałem.

Dziękuje Ci za pomoc i miłego dnia życzę ;)

Po to jest Forum. :) Dziękuję, wzajemnie.

0 głosów
odpowiedź 14 października 2017 przez mokrowski Mędrzec (155,460 p.)
std::string(1, litera);

 

komentarz 14 października 2017 przez Shiro Stary wyjadacz (10,300 p.)

U mnie to działa tylko jeżeli użyje przy tworzeniu zmiennej (chcę użyć tego wewnątrz pętli więc takie użycie mi trochę nie pomaga) 

Kod wygląda tak: 

	const string data = "YMDHND", support;

	for (int i = 0; i < data.length(); i++)
	{
		support = support(1, data[i]); //to niestety nie działa 
		timeNow[i] = TimeSignature(support);
	}

Czy źle tego używam ?

komentarz 14 października 2017 przez mokrowski Mędrzec (155,460 p.)

Oczywiście że źle. Ja podałem Ci jeden z konstruktorów. W Twojej 5 linii do istniejącego support chcesz przypisać ... istniejący support? Raczej:

support = std::string(1, data[i]);

 

–4 głosów
odpowiedź 14 października 2017 przez kosaa Stary wyjadacz (14,130 p.)
edycja 14 października 2017 przez kosaa
char a = 'a';
string mystring = "" + a;
cout << mystring;

 

komentarz 14 października 2017 przez adrian17 Ekspert (344,860 p.)
warning: adding 'char' to a string does not append to the string [-Wstring-plus-int]
        string mystring = "" + a;
                          ~~~^~~

 

komentarz 14 października 2017 przez kosaa Stary wyjadacz (14,130 p.)
hmm... kompilacja przebiega pomyslnie

Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
komentarz 14 października 2017 przez adrian17 Ekspert (344,860 p.)
To warning, nie error. Ale bardzo wyraźnie mówi, że ten kod zrobi co innego niż myślisz.

U ciebie jest 0 ostrzeżeń pewnie dlatego, że masz jakiś dość stary kompilator (GCC4.9?)
komentarz 14 października 2017 przez kosaa Stary wyjadacz (14,130 p.)
[kosa@localhost ~]$ gcc --version
gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
Copyright (C) 2017 Free Software Foundation, Inc.

az sam zaczalem szukac w czym tkwi roznica

komentarz 14 października 2017 przez adrian17 Ekspert (344,860 p.)
Sprawdziłem; GCC7 zauważa że coś jest nie tak dopiero przy optymalizowaniu (dodaj -O2 lub zaznacz checkbox optymalizacji w C::B, jeśli go używasz).

Podobne pytania

0 głosów
1 odpowiedź 698 wizyt
pytanie zadane 1 listopada 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
1 odpowiedź 6,907 wizyt
pytanie zadane 24 czerwca 2016 w C i C++ przez MasterFlamaster Początkujący (300 p.)
0 głosów
2 odpowiedzi 6,360 wizyt
pytanie zadane 9 czerwca 2016 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...