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

Kopiowanie typu string

VPS Starter Arubacloud
0 głosów
1,013 wizyt
pytanie zadane 15 lipca 2016 w C i C++ przez Ganjax666 Nowicjusz (190 p.)

Witam

Jestem początkujący w programowaniu i piszę taki prosty programik który wczyta liczbe do stringa i zapisze ją w drugim stringa od tyłu lecz nie wiem dlaczego tmój kod nie działa. Wyświetla poszczególne liczby w stringu ale nie wyświetla całej liczby.Z czego to wynika ? Zła metoda na kopiowanie czy jakieś niedopatrzenie?

#include <iostream>

using namespace std;

int main()
{
    string liczba;
    string pal;
    int k=0;

    cin>>liczba;
    int dlug=liczba.length();
    for(int i=dlug-1; i>=0; i--)
    {
        pal[k]=liczba[i];
        cout<<pal[k]<<endl;
        k++;
    }
    cout<<pal<<endl;//nie wyświetla :(
    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 15 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 15 lipca 2016 przez Ganjax666
 
Najlepsza

Wcale się nie dziwię, że nie wyświetla.. problem leży w wartości początkowej stringa [pal]. Nic do niego na początku nie wpisujesz co sprawia, że jego długość wynosi 0. Zapis pal[k]=liczba[i] sprawia, że do komórki o adresie pal+k wprowadzasz wartość liczba[i].. komórka ta jednak nie należy do stringa pal. Na początku powinieneś przygotować miejsce dla znaków/wartości w tym stringu ustawiając mu odpowiednią długość.
Dodanie poniższej linijki przed pętlą for załatwi sprawę:
pal.resize(dlug);

0 głosów
odpowiedź 15 lipca 2016 przez Radfler VIP (101,030 p.)

String pal jest pusty (tj. jego size()==0). Dokonując takiego przypisania

pal[k]=liczba[i];

naruszasz pamięć. Powinieneś użyć operatora +=, aby dopisywać nowe znaki.

pal += liczba[i];
0 głosów
odpowiedź 15 lipca 2016 przez Ganjax666 Nowicjusz (190 p.)

Dzięki za odp. wykorzystałem obie metody w programie i działają ok ale coś mi sie sypie w programie i nie  mogę dojść dlaczego. Robie zadanie ze spoja. Chodzi o szukanie palindromów czyli liczb czytanych w obu kierunkach tak samo.

Jesli dana liczba nie jest palindromem to liczba i ta liczba czytana od tyłu są sumowane i suma jest sprawdzane ponownie czy jest palindromem np. 28 nie jest wiec 28+82=110 110 nie jest więc 110+011=121 i 121 jest palindromem.

Już prawie działa :) ale prawie robi wielką różnice. Nie moge dojść co sypie

#include <iostream>
#include <cstdlib>
#include <sstream>

using namespace std;

int main()
{
    int k=0;
    string liczba;
    string tyl;
    cin>>liczba;

    int dlug=liczba.length();

    for(int i=dlug-1; i>=0; i--)
    {
        tyl+=liczba[i];                     //zapisuje liczbe od tylu met1
    }
    cout<<"liczba od tylu nr1: "<<tyl<<endl;

    while(liczba!=tyl)
    {
        int cyfint1=atoi(liczba.c_str());
        int cyfint2=atoi(tyl.c_str());          //przerobienie stringów na inty
        int suma=cyfint1+cyfint2;               //sumowanie intow

        ostringstream ss;
        ss << suma;
        liczba = ss.str();
        cout<<"suma "<<liczba<<endl;                //zapisanie sumy w stringu

        int dlug=liczba.length();
        cout<<"dlugosc nowej liczby "<<dlug<<endl;

        tyl.resize(dlug);
        for(int i=dlug-1; i>=0; i--)
        {
            tyl[k]=liczba[i];
            k++;                                    //tworzenie nowej liczby od tylu met2
                                                    //nie tworzy nowych liczb
        }
        cout<<"kolejne liczba od tylu "<<tyl<<endl;
    }
    cout<<"Ta liczba jest palindromem: "<<tyl<<endl;
    return 0;
}

 

komentarz 15 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)

Polecam porozdzielać sobie kod na funkcje.. ułatwia to odnajdywanie się w kodzie i znajdywanie błędów też jest prostsze. Tutaj masz dość mocno zmodyfikowaną wersję twojego kodu (o ile można to nazwać modyfikacją xD), może ci się przyda. Co do samego problemu to nie mam pojęcia co może być nie tak.. : /
Mój kod:

#include <iostream>
#include <sstream>

using namespace std;

string GetString(int Value)
{
    stringstream ss;
    ss<<Value;
    return ss.str();
}

string InvertString(string &String)
{
    string Ret;
    for(int i=String.size()-1; i>=0; i--) Ret+=String[i];
    return Ret;
}

int GetValue(string &Text)
{
    stringstream ss;
    int Ret;
    ss<<Text; ss>>Ret;
    return Ret;
}

bool IsPalindrome(string &Text)
{
    for(int i=0; i<=Text.size()/2; i++)
        if(Text[i]!=Text[Text.size()-1-i]) return false;
    return true;
}

int main()
{
    string liczba, tyl;
    int suma;
    cin>>liczba;

    while(true)
    {
        if(IsPalindrome(liczba))
        {
            cout<<"Ta liczba jest palindromem"<<endl;
            break;
        }

        tyl=InvertString(liczba);
        cout<<"Liczba od tylu: "<<tyl<<endl;

        suma=GetValue(liczba)+GetValue(tyl);
        cout<<"Suma: "<<suma<<endl;

        liczba=GetString(suma);
        cout<<"--Dlugosc nowej liczby: "<<liczba.size()<<endl;
    }
    return 0;
}

 

komentarz 15 lipca 2016 przez Ganjax666 Nowicjusz (190 p.)
Dzięki za zainteresowanie :) rzeczywiście Twój kod jest bardziej profesjonalny jeszcze muszę sporo opanować żeby go ogarnąć ale chętnie przeanalizuje.i rozkminie go. Anyway wciąż nurtuje mnie ten mój kod bo pół dnia nad nim siedzę :P
komentarz 15 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)
Tą zagadkę to już pozostawiam tobie..
Powodzenia x)

Podobne pytania

0 głosów
2 odpowiedzi 140 wizyt
0 głosów
2 odpowiedzi 994 wizyt
pytanie zadane 15 maja 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
–1 głos
3 odpowiedzi 1,132 wizyt
pytanie zadane 12 grudnia 2019 w C i C++ przez Winston_Smith Nowicjusz (120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...