[C++] Zliczanie sumy cyfr z tablicy char do liczby int


(Thewhitedragoon) #1

Witam!

Podczas pisania pewnego prostego programu wykryłem błąd. Mianowicie, program ma zliczać sumę cyfr, które są przechowane w tablicy typu char do liczby całkowitej typu int. Wszystko jest dobrze dopóki tablica nie przechowuje takiej danej a103 (pierwszy znak zawsze musi być literą alfabetu, a reszta cyframi). Wtedy suma wynosi 1, bo wszystkie inne cyfry, które wystąpią po zerze nie są już zliczane. Dajmy na to taki kod:

#include 

#include 


int main()

{

    using namespace std;


    char tablica[10];

    int suma = 0;

    int licznik;


    //wczytanie tablicy, pierwszy znak to litera, reszta (reszta < 10) to cyfry

    cin >> tablica;


    //petla, dzieki ktorej tablica bedzie przechowywac cyfry, a nie kod ascii tych cyfr

    for (licznik = 1; licznik < strlen(tablica); licznik++)

        tablica[licznik] = tablica[licznik] - '0';


    //wyliczenie sumy cyfr

    for (licznik = 1; licznik < strlen(tablica); licznik++)

        suma = suma + tablica[licznik];


    //wypisanie danych

    cout << suma << endl;


    return 0;

}

Kiedy wpiszemy do tablicy s123 Program wypisze sumę 6. Kiedy na wejściu wpiszemy jednak z30012 to suma wynosi 3, a powinna 6. Tak samo się dzieje kiedy całą liczbę z tablicy chcę przepisać do zmiennej int. Cyfry po jakimkolwiek, zerze są pomijane. Co robię źle i jak temu zaradzić?


(Starkowski Dawid) #2
'0' - '0' = NULL

strlen zlicza tylko do wystąpienie tego znaku. Przed pierwszym for, stwórz zmienną

int l = strlen(tablica)

i używaj jej w pętlach.


(Fiołek) #3

Wynik odejmowania znaku '0' od znaku '0' da... 0('\0'). Przez to druga pętla nie wykona się cała tak jak byś chciał, gdyż otrzymany c-string ma na miejscu znaków zer znak '\0'(i przez to jego długość jest mniejsza). Zamień obie pętle w jedną:

for (licznik = 1; licznik < strlen(tablica); licznik++)

    suma += tablica[licznik] - '0';

Dodatkowo ja bym uważał przy używaniu tablicy charów do wczytywania danych(i nie zabezpieczenia się przed tym) - co jeśli użytkownik poda np. 10 znaków? Mamy naruszenie pamięci.


(Thewhitedragoon) #4

Jest dobrze. Nie wiedziałem o tym, że

'0' - '0' = NULL

Teraz będę uważał. Dzięki.