Następujący błąd kończy się niepowodzeniem prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’
int main()
{
char d = 'd';
std::string y("Hello worl");
y.append(d); // Line 5 - this fails
std::cout << y;
return 0;
}
Spróbowałem również poniższego, który kompiluje się, ale zachowuje się losowo w czasie wykonywania:
int main()
{
char d[1] = { 'd' };
std::string y("Hello worl");
y.append(d);
std::cout << y;
return 0;
}
Przepraszam za to głupie pytanie, ale przeszukałem google, zobaczyłem tylko „tablica znaków do tablicy znaków ptr”, „tablica znaków do tablicy znaków” itp.
Odpowiedzi:
Użyłbym
+=
operatora zamiast nazwanych funkcji.źródło
gcc
,basic_string::operator+=
to tylko wezwaniepush_back
.y
jest tochar*
zamiaststd::string
. Dodałbyd
znaki do wskaźnika y.Zastosowanie
push_back()
:źródło
Aby dodać znak do zmiennej std :: string przy użyciu metody append, musisz użyć tego przeciążenia:
Edycja: Masz rację Źle zrozumiałem parametr size_type, wyświetlany w pomocy kontekstowej. To jest liczba znaków do dodania. Więc prawidłowe połączenie to
nie
Lub najprościej:
źródło
sizeof(char)
zamiast1
? Chcesz dodać dokładnie jedno powtórzenied
, więc powiedz to. Używaniesizeof
tutaj jest mylące, ponieważ sugeruje, że należy podaćappend
rozmiar bajtu używanego typu danych (co nie ma miejsca).Oprócz innych wymienionych konstruktorów, jeden z konstruktorów łańcuchów przyjmuje znak i liczbę powtórzeń tego znaku. Możesz więc użyć tego do dołączenia pojedynczego znaku.
źródło
Testuję kilka propozycji, uruchamiając je w dużej pętli. Użyłem Microsoft Visual Studio 2015 jako kompilatora, a mój procesor to i7, 8Hz, 2GHz.
Zgodnie z tym testem wyniki są następujące:
Wniosek
+=
wydaje się bardziej zrozumiałe, ale jeśli myślisz o szybkości, użyj dołączaniaźródło
Spróbować + = operatora związek tekst , do dołączania () w tekst łącza lub push_back () w tekst łącza
Linki w tym poście zawierają również przykłady korzystania z odpowiednich interfejsów API.
źródło
problem z:
polega na tym, że musisz mieć „d”, a nie nazwę znaku, jak char d = „d”; A może się mylę?
źródło
char c = 'd'
i mogę obejść sięy.push_back(c)
bez problemu. Nie ma więc problemu zstd::string::push_back()
(poza tym, że jest dłuższy niż+=
).Należy zauważyć, że we wszystkich tych przykładach mogłeś stosować znak literalny bezpośrednio:
y += 'd';
.Twój drugi przykład prawie by zadziałał z niepowiązanych powodów.
char d[1] = { 'd'};
nie działa, alechar d[2] = { 'd'};
(uwaga tablica jest rozmiar dwa) byłby pracował w przybliżeniu taka sama jakconst char* d = "d";
i ciągiem znaków mogą być dołączone:y.append(d);
.źródło
Spróbuj użyć d jako wskaźnika y.append (* d)
źródło
char
nie jest łańcuchem i nie ma terminatora zerowego. Takie postępowanie powoduje niezdefiniowane zachowanie.*d
oznacza wskaźnik usuwania referencji,d
który jest błędem składniowym, ponieważd
nie jest wskaźnikiem.Zauważ, że napisałem 10u, a nie 10, ile razy chciałbym dodać znak; zastąp 10 dowolną liczbą.
źródło
Znalazłem prosty sposób ... Musiałem założyć
char
sznur, który był budowany w locie. Potrzebowałem,char list;
ponieważ dawałem użytkownikowi wybór i użyłem tego wyboru wswitch()
oświadczeniu.Po prostu dodałem kolejny
std::string Slist;
i ustawiłem nowy ciąg na równy znakowi, "liście" - a, b, c lub cokolwiek wybierze użytkownik końcowy, w ten sposób:Złożoność może być fajna, ale prostota jest fajniejsza. moim zdaniem
źródło
Dodanie również opcji wstawiania, o czym jeszcze nie wspomniano.
źródło
Jeśli używasz push_back, nie ma wywołania konstruktora ciągu. W przeciwnym razie utworzy obiekt łańcuchowy poprzez rzutowanie, a następnie doda znak w tym ciągu do innego ciągu. Za dużo kłopotu dla malutkiej postaci;)
źródło