Wątek zablokowany 2024-02-18 17:04 przez Althorion.

Rozdzielanie stringa na znaku

0
  1. Załóżmy istnienie dwóch zmiennych, np. a = 1 i b = 2.
    Chcę aby z a i b powstało c = 12. Da się to jakoś zrobić?

  2. Pierwsze pytanie ma rozwiązać problem z operowaniem na pliku tekstowym zapisanym w formie tabelki, gdzie zmienne oddzielone są różnymi znakami.
    Plik wygląda przykładowo tak:
    1_21,41'14
    30_12,5'3
    etc.
    nie wiem czy da się to zrobić inaczej, ale jedyne na co wpadłem to czytanie znak po znaku (plik.get()), ale w tedy z 21 zrobi się 2 i 1.

3

jak otworzysz pierwszy lepszy kurs c++ i skoczysz do rozdziału o operacjach na ciągach znaków to dostaniesz odpowiedź. BTW nie lepiej wziąć się za coś innego niż c++?, chociażby za c#

1

@paws: Wczytuj linia po linii do stringa za pomocą:

std::getline

Jak to zrobisz to użyj na stringu metody find.

std::ifstream file{"sciezka_do_pliku"}

std::string line;

while(std::getline(file, line)) {
  auto separator_pos{line.find('jakiś separator np. _')};
}
0

C++20 ma też całkiem przyjemne std::ranges::views::split do tego.

A jak ktoś, tak jak ja, ma wymuszony starszy standard, to może boost::split go zadowoli.

0
Eldorad O. napisał(a):

@paws: Wczytuj linia po linii do stringa za pomocą:

std::getline

Jak to zrobisz to użyj na stringu metody find.

std::ifstream file{"sciezka_do_pliku"}

std::string line;

while(std::getline(file, line)) {
  auto separator_pos{line.find('jakiś separator np. _')};
}

Nie Rozumiesz, mój problem z getline polega na tym że nie wiem jak mam wskazać programowi co robić kiedy znajdzie już ten znak (jak sprawić aby zapisał co jest do danego znaku jako a, od tego znaku do następnego jako b etc.)

1

@paws: Przecież napisałem jak możesz to zrobić, szukasz separatora ',', a później szukasz pozycji
kolejnego separatora '_' i zapisujesz znaki od pozycji separatora '_' + 1 do pozycji separatora ',',
wtedy otrzymasz 12 łącznie.

2

A ja podałem dwa kolejne rozwiązania. Mogę podać jeszcze trzecie — regex.

0

Załóżmy istnienie dwóch zmiennych, np. a = 1 i b = 2.
Chcę aby z a i b powstało c = 12. Da się to jakoś zrobić?

// Windows 10 Pro 2th24 64bit
// Visual Stuido 2th22 MSVC. w wersji: 1938 199711
// Developer Command Prompt
// cl.exe /EHsc /Fe:program.exe main.cpp
// {fmt} version fmt-10.2.0

#define FMT_HEADER_ONLY
#include <iostream>
#include <vector>
#include <cmath>
#include <fmt/core.h>
#include <fmt/format.h>
#include <fmt/color.h>

#define U unsigned int
#define X log2(1024)
using namespace std;
using namespace fmt::literals;

template <typename T>
struct POINTS { T p, r, s; };

template <typename T>
T join(T p, T r) {
    U decimus = static_cast<U>(0x0A);
    for (;r>=decimus;decimus*=static_cast<U>(X)){}
    return p*decimus+r;
}

auto main() -> int
{
    vector<POINTS<U>> v = {
        { 1, 6 },
        { 158, 1410 },
        { 1924, 2024 },
        { 9, 7 },
        { 21, 777 },
        { 3195, 18 } ,
        { 888, 1 }
    };

    const string cr = "\033[1;31m", cg = "\033[1;32m", rc = "\033[0m";

    for (auto& e : v) {
        e.s = join(e.p, e.r);
        fmt::print("( {}{}{} ).join( {}{}{} ) = {}{}{}\n",cg,e.p,rc,cg,e.r,rc,cr,e.s,rc);
    }
    fmt::print("\n");
    return 0;
}
1

@sherman:

#define U unsigned

Spalić to żywym ogniem

0
Eldorad O. napisał(a):

Jak to zrobisz to użyj na stringu metody find.

auto separator_pos{line.find('jakiś separator np. _')};

Przecież napisałem jak możesz to zrobić, szukasz separatora ',', a później szukasz pozycji
kolejnego separatora '' i zapisujesz znaki od pozycji separatora '' + 1 do pozycji separatora ',',
wtedy otrzymasz 12 łącznie.

bullshit

twa bystrość nie ma sobie równej
Jak już pobrałeś sobie string'a o nazwie "line" to do wyciągania z niego cyfr używa się "isdigit()".
pętelką po długości string line.length(), aż napotkasz znak, który jest cyfrą i
wstawiasz do jakiegoś string'a tmp. Następnie robisz konwersje do zmiennej typu integers ,np.
int num = std::atoi(tmp.c_str());

0

@sherman: Jak twoj kod ma sie do problemu opa?
W twoim kodzie jest tylko konkatenacja dwóch liczb, nie zaimplementowałeś nigdzie „wydobycia” liczb oddzielonych separatorami.
Twoja bystrość umysłu natomiast przerasta prostego człowieka jak ja.

Proszę cię, nasraj więcej gównokodu zawierającego każdy dostępny feature cpp do rozwiązania trywialnego problemu, wtedy wszyscy cię tu poklepią po główce jakim to świetnym jesteś programistą.

0

Jak twoj kod ma sie do problemu opa?
W twoim kodzie jest tylko konkatenacja dwóch liczb,

look at my post, odniosłem się tylko do:

Załóżmy istnienie dwóch zmiennych, np. a = 1 i b = 2.
Chcę aby z a i b powstało c = 12. Da się to jakoś zrobić?

nie zaimplementowałeś nigdzie „wydobycia” liczb oddzielonych separatorami.

napisałem, wyżej "złośliwcze", jak to można zrobić, bez szukania separatorów
możesz sobie wykorzystać kontener vector
std::vector<std::vector<int>> vec;

0

@sherman:

look at my post, odniosłem się tylko do:

No spoko, ale to podpunkt drugi był istotą problemu opa

Pierwsze pytanie ma rozwiązać problem z operowaniem na pliku tekstowym zapisanym w formie tabelki

napisałem, wyżej prostaku, jak to można zrobić, bez szukania separatorów

Napisałeś to po zamieszczeniu kodu, kolejność rozwiązania obu problemów powinna być raczej odwrotna.

"Prostaku" xd
Było sobie darować te docinki głupkowate o "bystrości" to zachowywałbym się inaczej.

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