Dziwne zachowanie string i printf

0

Witam.
Kiedyś coś skubałem w C++ dla zabawy, jednak teraz do szkoły mam wykonać program w C kodujący tekst z użyciem kodu Cezara. Jednak napotykam dość dziwny błąd.

Na samym początku wywołanie funkcji

printf("Tekst jawny: %s", tekst);

wypisuje na ekran Tekst jawny: ♀☻▬ - w skrócie 3 losowe znaki, czyli tak, jakby odwołuje się do adresu pamięci, w której nic nie ma. Dlaczego tak się dzieje? Czy printf jest niekompatybilne z typem string?

I jeszcze jedno: na samym końcu wypisuję

printf("Tekst oryginalny: %s\nTekst zakodowany: %s", tekst, zakodowany);

Co wyświetla się na ekranie?
Tekst oryginalny: (trzy losowe znaki znowu)
Tekst zakodowany: abcdefghijklmnopqrstuvwxyz
, czyli tak, jakby zmienna zakodowany była zapisywana w tym samym obszarze pamięci co zmienna tekst i ją nadpisywała.

Używam MS Visual Studio Express 2010 i przy wykonywaniu programu "krok po kroku" kodowanie tekstu działa normalnie.

Z góry dziękuję za pomoc.

#include "stdafx.h"
#include <string>

using namespace std;

int main()
{
    int liczba, dlugosc, pozycje;
    string tekst="abcdefghijklmonpqrstuvwxyz";
    string zakodowany;

    printf("Tekst jawny: %s", tekst);
    zakodowany=tekst;
    dlugosc=tekst.length();

    printf("\n\nO ile liter chcesz przesunac kazdy znak tekstu? (Zakres 1-25): ");
    scanf_s("%d", &liczba);

    for(int i=0; i<dlugosc; i++)
    {
    
        if(zakodowany[i]<=122-liczba) zakodowany[i]+=liczba; // 122-indeks litery "z" w ASCII
        else
        {
            
            pozycje=liczba;
            while(zakodowany[i]<122)
            {
                zakodowany[i]++;
                pozycje--;
            }
            if(pozycje>0)
            {
                zakodowany[i]=96; // znak poprzedzający literę "a" w standardzie ASCII
                zakodowany[i]+=pozycje;
            }
        }
    }
     
    printf("Tekst oryginalny: %s\nTekst zakodowany: %s", tekst, zakodowany);
    system("pause >nul");
    return 0;
}
3

printf() nie ma pojecia czym jest klasa std::string ani tez w zaden sposob jej nie obsluguje. Natomiast sama ow klasa posiada metode c_str(), dzieki ktorej mozemy rozmawiac z funkcjami oczekujacymi lancuchow w stylu C.

0
for(int i=0;i<dlugosc;++i) zakodowany[i]='a'+(zakodowany[i]-'a'+liczba)%26;
printf("Tekst oryginalny: %s\nTekst zakodowany: %s",tekst.c_str(), zakodowany.c_str());
0

Dziękuję bardzo za pomoc, wszystko działa :)
Czy jest jeszcze możliwość, by funkcja scanf jakoś reagowała na wprowadzanie wartości do zmiennej typu string?
Spróbowałem tak:

scanf("%s", tekst.c_str());

i niby zmienna tekst zawiera wprowadzany z klawiatury tekst, jednak długość łańcucha jest równa 0.

Tak to jest, jak człowiek najpierw dłubie przy C++ a potem musi przenieść się na C.

0

scanf nie służy do współdziałaniem ze string'iem.
Ze stringiem współdziała cin: - cin>>tekst;
Można to obejść:

tekst.resize(30); scanf("%30s",&tekst[0]); tekst.resize(strlen(&tekst[0]));

Ale odradzam takich dziwactw.

0

Racja, nie będę tego używał, bo może się zdarzyć, że będę musiał to powtórzyć później i nie będę wiedział jak się za to zabrać. Zostanę przy sztywno wprowadzonej wartości, nie chcę przekombinować tym bardziej, że wartość wprowadzana przez użytkownika nie jest wymagana (aczkolwiek nie jest też zabroniona).

Tak czy inaczej, dziękuję bardzo za pomoc. ;)

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