Wprowadznie do *char

2011-09-17 02:20
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?

Pozostało 580 znaków

2011-09-17 02:29
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.


"(...) otherwise, the behavior is undefined".
Tzn. jak mam zapisać do *char jakiś tekst? Jest w ogóle możliwe zapis przy pomocy scanf()? - czarny020 2011-09-17 02:40
pomijając że kod powyższy jest błędny z kilku powodów, scanf i printf jak najbardziej należą do C++. - Azarien 2011-09-17 09:24
brakuje jedynie using namespace std, niektóre kompilatory wszystko z cstdlib i cstdio itd. ładują do przestrzeni std. - Razi91 2011-09-17 12:52
Pisanie wstawek w asm też należy do możliwości C++ i co z tego? - Endrju 2011-09-17 14:47

Pozostało 580 znaków

2011-09-17 04:03
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
}
O free zapomniałeś. - hauleth 2011-09-17 07:19
Prawda, dzięki. Przekleństwo Garbage Collectora ;p - [losowa nazwa] 2011-09-17 15:54

Pozostało 580 znaków

2011-09-17 08:54
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;

<span style="color: red">//jestem marną podróbą somekinda</span>
Wydaje mi się, że całkiem fajnie ktoś próbuje się podszyć pod somekind'a - raportuję, niech rozpatrzy moderacja. - Mrowa 2011-09-17 12:03

Pozostało 580 znaków

2011-09-17 11:48
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].

edytowany 1x, ostatnio: Zjarek, 2011-09-17 11:49

Pozostało 580 znaków

2011-09-17 12:00
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;
}

Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-09-17 12:20
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

Pozostało 580 znaków

2011-09-17 20:58
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?

Pozostało 580 znaków

2011-09-17 21:22

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


edytowany 1x, ostatnio: byku_guzio, 2011-09-17 21:23

Pozostało 580 znaków

2011-09-18 00:32
0

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

edytowany 5x, ostatnio: czarny020, 2011-09-18 00:37

Pozostało 580 znaków

2011-09-18 00:50
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;
}

Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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