dodawanie dwóch Charów w C

0

mamy tablice charów

char* x="123";
char* y="852";
char* wynik="0000";
for(int i=0; i<3;i++)
wynik[i]=y[i]+x[i];

ostatnie polecenie nie działa. po porownaniu elementow o kolejnych indexach oczekuję outputu:

1+8=9, 2+5=7, 3+2=5

dowolne kombinacje konwersji (int) i (char) też nie pomagają. np.: wynik[i] = (char) ( (int) y[i] + (int) x[i] ) nie działa

jak mogę inaczej to zrobić żeby działało?
(uprzedzając pytania jest to mi potrzebne do działan arytm. na liczbach nie mieszczących się w long incie)

1

CStringi przetrzymują znaki w kodowaniu ASCII, zatem 1 -> 0x31, 8 -> 0x38, 1 + 8 -> 0x31 + 0x38 -> 0x69 -> i.

Standard C99 definiuje w stdint.h typ uint8_t, który do Twoich zastosowań będzie idealny. Jeśli z jakiegoś powodu nie możesz z tego skorzystać, to możesz np. odejmować '0' od wartości chara przed dodawaniem i dodawać po.

0
Althorion napisał(a):

CStringi przetrzymują znaki w kodowaniu ASCII, zatem 1 -> 0x31, 8 -> 0x38, 1 + 8 -> 0x31 + 0x38 -> 0x69 -> i.

Standard C99 definiuje w stdint.h typ uint8_t, który do Twoich zastosowań będzie idealny. Jeśli z jakiegoś powodu nie możesz z tego skorzystać, to możesz np. odejmować '0' od wartości chara przed dodawaniem i dodawać po.

Rozumiem i dziekuje za odpowiedz. Prawdpodobnie skorzystam z odjecia wartości ASCII z zera. Nadal jednak podtrzymuję pytanie odnośnie błędu tej linijki:
wynik[i]=y[i]+x[i];
czyli char = char+char. Kody ascii cyfr są niskie, a więc ich suma nie jest w stanie spowodować przekroczenia 1 bajta zarezerowanego dla char. Na czym polega błąd tej linii?
w sensie dla przykładu z 1+8, liczba szesnastkowa 0x69 to dziesietne 105, czyli mieści sie w dziesietnym przedziale (0,256) dla chara

0

A co Ci mówi kompilator? Nie mam teraz pod ręką żadnego, żeby sprawdzić, a za późno na parzenie kawy, żeby wróżyć z fusów…

0

Nie zwraca żadnego błędu, ale liczby nie wyświetla. Ponadto kończy program tuż po pierwszym wykonaniu tej linijki.
edit. po dokładniejszym sprawdzeniu już samo przypisanie wynik[i]=x[i]; kończy się tym samym

1

Jak wyświetlasz wynik? Aby tablica charów była poprawnym CStringiem, musi się kończyć na 0x00. Może tu tkwi problem?

Ogólnie, zapraszam do zabawy debuggerem tutaj, trochę trudno bez tego dociekać.

0
testkontoxd napisał(a):

mamy tablice charów

char* x="123";
char* y="852";
char* wynik="0000";
for(int i=0; i<3;i++)
wynik[i]=y[i]+x[i];

Te pięć linii ma chyba z 8 błędów świadczących o zupełnym nie rozumieniu C. Książkę w rękę i próbuj na czymś prostszym.

0

dobra ogarnałem ze char* nie mozna potem edytowac xD bylo słuchac uwazniej na wykładzie
usuncie temat bo autysci sie zesrają jak ten tutaj

AnyKtokolwiek napisał(a):
testkontoxd napisał(a):

mamy tablice charów

char* x="123";
char* y="852";
char* wynik="0000";
for(int i=0; i<3;i++)
wynik[i]=y[i]+x[i];

Te pięć linii ma chyba z 8 błędów świadczących o zupełnym nie rozumieniu C. Książkę w rękę i próbuj na czymś prostszym.

1

Można edytować. Nie można edytować literałów znakowych, a te niestety można przypisywać do wskaźników na mutowalne znaki. C++ tego błędu się już pozbył.

Użyj

char wynik[]="0000";
0

w ogóle co trzeba miec w banii zeby napisac komus na forum "hehe widze tutaj nowicjusz, duzo bledow wgl nie rozumiesz, ale w zasadzie to nie powiem ci co i jak. idz robic cos prostszego".

0
kq napisał(a):

Można edytować. Nie można edytować literałów znakowych, a te niestety można przypisywać do wskaźników na mutowalne znaki. C++ tego błędu się już pozbył.

Użyj

char wynik[]="0000";

Dzięki za odpowiedz ;d dosłownie chwilę temu skojarzyłem, że na wykladzie było coś mówione o różnicach między char[] a char*. Korzystając z char[] kod działa jak należy

0
testkontoxd napisał(a):

w ogóle co trzeba miec w banii zeby napisac komus na forum "hehe widze tutaj nowicjusz, duzo bledow wgl nie rozumiesz, ale w zasadzie to nie powiem ci co i jak. idz robic cos prostszego".

Więc ten autysta zasugeruje jako WIODĄCE ustalenie strategii dodawania znaków/cyfr/bajtów. Czy zero to '\0' (co wyklucza koniec c-stringów - trzeba wymyślić inaczej), czy '0', kiedy wnosić korektę. Najpierw choćby minimalistyczne założenia, poten kodzik.

Dodaje się od końca, więc gdzie ten koniec ... wszystko trzeba ustalić.

typ o jakim tu mowa w slangu nie nazywa się CString (bo są takie i się mylą) ale najczęściej się pisze C-string

0

Ok dzieki za odpowiedz, sory za to z autystą ale sie ztiltowałem przez taką hipotetyczną sytuacje: gdybyśmy wrócili do tamtego postu i bym sie nie dopatrzył błędów z tamtego kodu i gdyby nie pojawiły sie kolejne posty z pomocą, to po twojej wypowiedzi w istocie zrezygnowałbym z tego projektu i pogodził sie z hehe dwujeczkom z laborek. Takze sory za ubliżanie ale mysle że dosyć fair byłoby niepisanie postow w stylu 'dobra noobie zostaw to i idz ksiązke poczytac to moze kiedys nie bedziesz noobem'.

Co do tego postu to dzieki za propozycje. Na ten moment plan jest taki:
dla kazdego i od 0 do dł.tablicy-1

  1. od kazdego ze składników dodawania odejmuję '0'
  2. zapisuję sumę do wynik[i]
  3. dodaję '0' do wynik[i]
    4)koniec
    załozenie mojego programu pomija przeskoki z wyższych kodow ASCII niż ten odpowiadający cyfrze 9 bo ma on służyc do dodawania 'w słupku' kolejnych indeksów (zatem przykładowe liczby '6' + '9' = '15' to 5 i dodanie 1 do jednego do składników na indeksie o jeden wyższym). Końca takiego stringa/tablicy charow chyba tez nie uzyję bo nie przewiduję spacji a początkowa dł. tablicy wynik nie zmieni się (chyba że o 1 większa dla np. stringów '999' + '1' = '1000')

dzieki wszystkim za odpowiedzi i pozdro z fartem

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