Jak przepisać liczbę cyfra po cyfrze do tablicy?

0

Witam! Mam problem, gdyż potrzebuję wykonać czynność opisaną w temacie, a nie do końca wiem jak to wykonać.. Chodzi mi o to, że potrzebuję przekonwertować liczbę do tablicy np. '1234' ---> tab[0] = 1 , tab[1] = 2 itd. Zaznaczam, że raczej dzielenie modulo będzie trudno dla mnie do wykonania, gdyż wprowadzane liczby nie będą miały ograniczeń. Tzn będę ograniczał taką precyzję w makrach, ale i tak jest to ciężkie do wykonania(tak mi się wydaję?). poza tym znalazłem rozwiązanie konwertowania do string jednak wtedy mam wartości liczb w kodzie ASCII i nie do końca wiem jak sobie z nimi poradzić i po kolei skonwertować na liczby. Próbowałem również używać funkcję typu atoi jednak one operują na całych łańcuchach, a ja potrzebuję operować na typie const char*.

Pozdrawiam i dziękuję za jakiekolwiek wskazówki.

0

Nie rozumiem dlaczego nie możesz wykorzystać chociażby snprintf(). Typ const char to nic innego jak wskaźnik na tablicę.

Autokorekta: const char*

0

Tak tylko kompilator wypisuje mi błąd "cannot convert 'std::string' to 'const char*' for argument '3' to 'int snprintf(char*, size_t, const char*, ...)' "
poza tym snprintf z tego co wyczytałem i próbowałem operuje na tabliach znakowych, a ja potrzebuję tablicę int'ów aby móc na niej wykonywać obliczenia.
??

0

atoi nie ma? Czemu string?

0

Tu masz, ale nie wiem czy o to Ci chodziło:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    const char*liczba="1234";
    int tab[4];
    int licz = atof(liczba);
    
    for(int i=0;i<4;i++)
    {
         tab[i]=licz %10;
         licz/=10;   
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
} 
0

Generalnie:

char z='7';
int Z=z-'0'; // Z ma wartość odpowiednią cyfrze zapisanej w z.

Więc konwersja:

int konwerja(char *str)
  {
   char *p=str;
   while(isdigit(*p)) *(p++)-='0';
   return *p?0:p-str;
  }

char buf[20]="0123456789";
int len=konwerja(buf);
for(int i=0;i<len;++i) cout<<(int)buf[i]<<' ';
0

OK. Dziękuję za podpowiedzi. Chodziło mi o coś takiego jak napisał Szewy oraz _13th_Dragon, jednak na moje potrzeby bardziej wygodna będzie wersja z modulo. Ogólnie chodzi o to, że będę realizował dodawanie dużych liczb i przez potrzebuję skonstruować obiekt również z double. Dlategoteż mam kolejny znak znak zapytania, a mianowicie mam taki kod:

 
const double dLiczba = 458132.3842;
    int iPrzed[PRZED];
    unsigned int uiPo[PO];
    for(int i = 0; i<PRZED;i++) iPrzed[i] = 0;
    for(int i = 0; i<PO; i++) uiPo[i] = 0;

    if(dLiczba > 0)
		{
                                  bZnak = true;
			int idLiczba = floor(dLiczba);

			for(int i = 0; i< PRZED;i++)
			{
				iPrzed[PRZED-1-i] = idLiczba %10;
				idLiczba /= 10;
			}

            double dPoPrzecinku = (dLiczba - floor(dLiczba));
            double pom;
            dPoPrzecinku *= 10;

            for(int i = 0; i<PO; i++)
            {
                uiPo[i] = floor(dPoPrzecinku);
                pom = uiPo[i];
                dPoPrzecinku *= 10;
                dPoPrzecinku -= pom * 10;
            }

(PRZED i PO zadeklarowane w makrach)i wszystko całkiem przyjemnie działa. Problem jedynie w tym, że kompilotor przyjmując liczbę double nie zapełnia cyfr za ostatnio cyfrą w ułamku zerami, tylko po prostu ją zaokrągla np. dla tego przypadku ( 458132.3842 --> 458132.38419999997) czy da się temu jakoś zaradzić? czy po prostu wykonywać operację na takich liczbach?
Pozdrawiam

0

Problem polega na kodowaniu wewnętrznym liczb zmiennoprzecinkowych.
Np liczba 0.1 nie może zostać zapisana dokładnie, przez to taki oto kod:
double suma=0;
for(int i=0;i<1000;++i) suma+=0.1;
if(suma!=100) cout<<"ale numer"<<endl;
wyświetli tekst "ale numer".
zawsze możesz określić pewną dostatecznie małą Epsilon,
czyli jeżeli liczba okaże się mniejsza od Epsilon to przyjąć że dalej są same zera,
zaś jeżeli liczba jest większa niż 1-Epsilon to zwiększyć to zwiększyć ostatni znak o jeden (z uwzględnieniem skutków dla całości) i przyjąć że dalej są same zera.

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