Wprowadznie do *char

0
#include<cstdio>

int main(){
    char *text;
    scanf("%s", text);
    printf("%s", text);
    retrun 0;
}

Mam problem ze wprowadzaniem zmiennej text do *char.
Przykład:
input: ala ma kota
i na output nie mogę otrzymać tego samego. Jak powinno wygldać to poprawnie?

0

Otagowałeś C++ i używasz nagłówków dla C++.

W C++ poprawne będzie użycie std::cin i std::string, zdecyduj się, bo to co piszesz to C.

0

Wydaje mi się, że powinieneś najpierw zaalokować pamięć pod napis, który chcesz wczytać.

int main(){
    char *text;
    text = (char*) malloc(100); // chyba tak, jesli dobrze pamietam
    scanf("%s", text);
    printf("%s", text);
    retrun 0; // <-- literowka :p
}
1

Co za spece, śmiać idzie z nich pełną parą.

@czarny020
Jeśli nie znasz typu string zrób tak:

char text[30] = { 0 };
std::cin >> text;
0
sowekind napisał(a)

Co za spece, śmiać idzie z nich pełną parą.

Wprowadzam_dość_długi_tekst_bez_spacji_żeby_zepsuć_program_i_zrobić_buffer_overflow.

Cin>> nie umożliwia ci sprawdzenie ilości znaków wpisywanej do zmiennej char* (lub char[]), więc nie powinien być używany do cstringów. Jeżeli musisz już ich używać to użyj scanfa z np. "%30s".

edit: oczywiście ten modyfikator to dla zmiennej char text[30+1].

1

Jednak jeżeli jest to C++, to polecam autorowi zapoznać się z kontenerem std::string i osiągnie to co chce bez zbędnych specyfikacji.

#include <iostream>
#include <string>

int main()
{
	std::string tekst;

	getline(std::cin, tekst);
	std::cout << tekst;

	getchar();
	return 0;
}
0
czarny020 napisał(a)
#include<cstdio>

int main(){
    char *text;
    scanf("%s", text);
    printf("%s", text);
    retrun 0;
}

Mam problem ze wprowadzaniem zmiennej text do *char.
Przykład:
input: ala ma kota
i na output nie mogę otrzymać tego samego. Jak powinno wygldać to poprawnie?

To co piszesz jest źle z tego powodu, że char* jest to wskaźnik na typ char. Należałoby użyć operatora new, żeby zaalokować pamięć, a później delete, żeby ją zwolnić.
Domyślam się, że nie posiadasz wiedzy na ten temat, więc na razie powinieneś używać tablic znaków (jak napisał somekind), lub lepiej std::string

0

Chodzi o to, że na początku nie wiadomo ile będzie znaków, natomiast zaalokowanie tab wjąże się z podaniem rozmaru tablicy, chcę po prostu uniknąć zarezerwowania większego obszaru pamięci niż jest to mi potrzebne. Dlatego po wprowadzeniu do char* tekstu można dokładnie określić jaki jest ten obszar. Dlatego pytam jak wprowadzać do *char (uwaga!) rezerwując obszar pamięci dopiero po poznaniu wyrazu?

1
  1. Tak się nie da. Żeby poznać rozmiar wyrazu musisz go wczytać, a żeby wczytać to trzeba mieć gdzie go wczytać i przechowywać.
  2. Zapamiętaj raz na zawsze - char* NIE PRZECHOWUJE NAPISÓW i już! - nie można do niego wczytać napisu(poczytaj jeszcze raz o wskaźnikach)
  3. Poczytaj(tak jak już Ci wcześniej inni napisali) o std::string
0

Dzięki wszystkim! :) Mam jeszcze pytanie, czy jest jakaś gotowa funkcja, która odwraca stringa, tzn. mam teskt i odraca na tkset

1

W bibliotece <algorithm> jest funkcja która to robi.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string napis("Jakis tam sobie napis");
    reverse(napis.begin(), napis.end());
    cout << "Odwrocony napis to: " << napis;
    getchar();
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1