Wyświetlanie połowy stringa

Wyświetlanie połowy stringa
TA
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:37
0

Witam skleiłem coś takiego:

Kopiuj
#include <iostream>
#include <string.h>
#include <vector>

using namespace std;

int t,i=0,t1,i1=0,td,i2=0;
int d1[1000];
string napis[1000];

int main()
{
    cin>>t;
    t1=t;
    td=t;
    while(t>0)
    {
        cin>>napis[i];
        t--;
        i++;
    }
    while(t1>0)
    {
        d1[i1]=napis[i1].length()/2;
        string w=napis[i1];
        char * ct = new char[i1+1];
        strcpy(ct,w.c_str());
        string wy;
        for(int a=0; a<d1[i1]; a++)
        {
            wy+=ct[a];
        }
        cout<<wy<<endl;
        t1--;
        i1++;
    }
    return 0;
}

Działa ale wydaje mi się że jest to strasznie prymitywne... Ogólne zadanie polega na tym że wpisujesz na początku liczbę ile stringów wpiszesz potem je wpisujesz a program obcina ci do połowy. Ma ktoś pomysł jak to poprawić aby "ładniej" wyglądało? Szczególnie boli mnie to multiplikowanie zmiennych i stałych...

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Szczecin
1

Twój program jest niepoprawny: https://wandbox.org/permlink/Z3AkXxgpS2Ds706R

Zamiast bawić się w błędne new i delete (po co, skoro i tak używasz stringa?!) i zbędnie sobie utrudniać pracę, idź "na łatwiznę":

Masz tu alternatywę:

Kopiuj
int main()
{
    int count;
    std::cin >> count;
    while(count --> 0) {
        std::string s;
        std::cin >> s;
        s.resize(s.size()/2);
        std::cout << s << '\n';
    }
}

BTW: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/


edytowany 1x, ostatnio: kq
TA
A da się to razem z tablicą? Zmodyfikowałem mój kod wzorując się na twoim i ciągle mam błąd:/ Nie wiem dlaczego bo dla mnie to logiczne co każę wykonać. Kod zamieszczam poniżej.
DR
@kq: Niezainicjowana zmienna nie jest UB?
kq
Nie, odczyt niezainicjalizowanej może być UB, ale tutaj pierw jest zapis, potem odczyt :​)
DR
@kq: No ale jak nie wpiszesz nic i od razu wciśniesz to będzie chyba?
kq
Nie rozumiem. operator>> przypisuje wartość
DR
@kq: cin >> czeka na string, a ja od razu mu podam enter
kq
Jak odczyt się nie powiedzie to zostanie zapisane zero. https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt
DR
@kq: Zawsze tak było, bo bym dał rękę sobie uciąć ze kiedyś to było UB :p I teraz pewnie ręki bym nie miał
kq
Miałbyś rękę - zmiana od C++11 :​)
DR
Aa no właśnie. Przed C++11 zmieniłem język :p dzięki za wyjaśnienie
MarekR22
weź popraw umiejscowienie spacji, bo jeszcze jakiś newbie pomyśli, że tam jest długa strzałka ;) (szczególnie, że kolorowanie składni potęguje to wrażenie).
TA
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:37
0
Kopiuj
#include <iostream>

using namespace std;

int t,i=0,t1,i1=0;
string napis[1000],n[1000];

int main()
{
    cin>>t;
    t1=t;
    while(t>0)
    {
        cin>>napis[i];
        t--;
        i++;
    }
    while(t1>0)
    {
        n[i1]=napis[i1].resize(napis[i1].size()/2);
        cout<<n[i1]<<endl;
        t1--;
        i1++;
    }
    return 0;
}
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Szczecin
0

A co za błąd masz? Szklana Kula ma wolne - niedziela. Pomijając użycie while zamiast for, i krótkie, niedeskryptywne nazwy zmiennych, chyba jest ok, o ile liczba stringów wejściowych jest mniejsza niż 1000


TA
|20|error: no match for 'operator=' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'void')| Hmm użyć for zamiast while i polepszyć nazwy? Zapamiętam. I ciekawe określenie siebie jako "Szklana Kula";) Mogę zaczekać do jutra czy nawet przyszłego roku robię inne zadania i jakoś idzie mimo wszystko dziękuję za całą pomoc którą już od Ciebie otrzymałem.
kq
Odpowiedzi w odpowiedziach
kq
Do odpowiedzi na forum służą odpowiedzi, nie komentarze.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.