ANSI C - konwersja tablicy znakow na liczby

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

WITAM!
Czy ktos sie orientuje jak skonwertowac kilka elementow talbicy (nazwijmy ja char tablica[20];) na liczby. Chodzi mi glownie o to:
1. Wczytuje do tablicy ciag znakow, tak ze da nam to w uproszczeniu:

Kod: Zaznacz cały

tablica="123 aasd [][;sdf";
2. Chce zamienic pierwsze 3 elemnty tablicy na liczbe by moc na niej dokonywac obliczen, tj:

Kod: Zaznacz cały

int x= tablica[0] tablica[1] tablica[2];
x++=124;
Mam nadzieje, ze rozumiecie o co mi chodzi. Czy jest od tego jakas funkcja czy musze sie bawic w kodzie ascii i dodaniu jeden poprzez wlasnie ten kod?? Z gory dzieki za pomoc. POZDRO
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: Szemek »

do konwersji użyj funkcji atoi
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Ok. Dziex. Jesli jednak tablica bedzie wygladac tak:

Kod: Zaznacz cały

tablica="123 asd 432";
I chce wczytac obie te liczby, tj:

Kod: Zaznacz cały

int x,y;
x=123;
y=432;
Jak zrobic by wczytac liczbe z dalszej czesci tablicy?? POZDRO
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: Szemek »

spróbuj pomyśleć nad pętlą, żeby przepisywać poszczególne ciągi cyfr do innej tablicy,

funkcja sprawdzająca czy znak jest cyfrą
isdigit

na razie nic innego mi do głowy nie przychodzi
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

No wlasnie tak kombinuje :/ Myslalem, ze moze jest cos gotowego, no ale nic. Dzieki za pomoc. POZDRO

[ Dodano: 1 Listopada 2007, 16:46 ]
Sory ze dodaje post pod postem, ale chce zeby blo widoczne. Mam nastepy problem.
Juz sobie prawie poradzilem prawie z wpisywaniem z tablicy do dwoch oddzielnych tablic. Pojawil sie jednak problem z robieniem wyjatkow. Na poczatku czyszcze wszystke tablice o tak:

Kod: Zaznacz cały

char tablica[30];
char pierwsza[30];
char druga[30];

tablica="123 432";

memset(tablica,0,30);
memset(pierwsza,0,30);
memset(druga,0,30);
Jako ze do pierwszej latwo jest wczytac to pozniej wystepuje znak spacji, czyli w kodzie ascii 0. Jak rozpoznac, kiedy to 0 jest spacja, a kiedy jest koncem tablicy tablica="123 432"; ?? POZDRO
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

Spacja o ile wiem ma kod ascii 32. Zero jest raczej na koncu - informuje kompa, ze to zakonczenie zmiennej tekstowej....

Spróbuj moze tego kodu:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

int kon(char *t, int liczby[20]){
	char buf[10];
    int i = 0, j = 0, k;
    #define CYF(x) (x>47&&x<58)

	while(t[i]){
		if(CYF(t[i]) ||
		(t[i] == 45 && CYF(t[i+1]))){
			memset(buf, 0, 10);
			k = 0;
			do buf[k++] = t[i++];
            while(CYF(t[i]));
			liczby[j++] = atoi(buf);
		}
		i++;
	}return j;
}

int main(){
	char *str;
    int n[20], i, liczb;

	gets(str);
    liczb = kon(str, n);
	for(i=0;i<liczb;i++)
		printf("%i
", n[i]);

return 0;
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Ok. Dzieki za ten programik. Mam jeszcze pytanie:
Czemu nie dziala mi funkcja atof, w takim kodzie:

Kod: Zaznacz cały

char tablica[30];
char pierwsza[30];
int i;

memset(tablica,0,30);
memset(pierwsza,0,30);

scanf("%s",tablica);
for (i=0;i<10;i++) pierwsza[i]=tablica[i];
printf("%f", atof(pierwsza));
??

Wyswietla mi 0.0000
POZDRO
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

Kod jest jak najbardziej ok, wina kompilatora. U mnie na poczatku bylo 0.00.. a po kolejnej kompilacji juz dzialalo. Upewnij się ze na początku masz #include bo tam jest atof zdeklarowany
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Hehe no to ten roblem rozwiazany Rzeczywiscie nie dodalem biblioteki stdlib. Mam jeszcze kolejne pytanko apropo tej spacji. Mi rozpoznaje ja jakos 0, tj mam fragment kodu pewnej funkcji (w uproszczeniu):

Kod: Zaznacz cały

int zwrot;
memset(tablica1,0,30);
memset(tablica2,0,30);
tablica1="123 321";
tablica2="123";

if (tablica2[3]==0) zwrot=2;
if (tablica1[3]==0) zwrot=0;
if (isspace(tablica1[3])) zwrot=1;
Moze troche zle to zapisalem, jednak mi wywala zwrot =0, co jest niezgodne z prawda :/ Wiesz moze dlaczego tak sie dzieje?? Dodam, ze jak zawiesilbym ta linijke warunkowa w srodku to by bylo zwrot=1... POZDRO
Ostatnio zmieniony 1 lis 2007, o 21:52 przez soku11, łącznie zmieniany 2 razy.
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

Mozesz proprawic troche kod, bo jest kilka niejasnosci: pojawia sie zwrot i zwroc - literowka(w tej sytuacji kluczowa) czy tak ma być?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Poprawione - wszystko ma byc zwrot Mozesz teraz zerknac??
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: smiechowiec »

wartość zmiennej zwrot nie została zainicjowana, jeżeli jest to zmienna globalna to zazwyczaj kompilator przypisuje jej 0.
Jeżeli żaden 3 z warunków nie jest spełniony wartość zmiennej jest równa wartości zainicjowanej.
możesz napisać dla pewności przed warunkami np.
zwrot = 255

Poza tym sposób przypisania zmiennej typu char najlepiej zrobić za pomocą strcpy(zwrot, "123 aaa""), albo przypisać taką wartość w czasie deklaracji.
Ostatnio zmieniony 1 lis 2007, o 22:08 przez smiechowiec, łącznie zmieniany 1 raz.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

No w tym sek, ze w oryginalnym programie tak wlasnie mam :/ Bo dochodza tutaj jeszcze inne warunki. Dla pozostalych sobie ustalilem ze zwrot=-1 i tak wlasnie przed tym mam. Problem jest tutaj gdzies w tym porownaniu :/
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: smiechowiec »

Wklej cały kod jaki masz to zobaczę.
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

A sprawdź to u siebie:

Kod: Zaznacz cały

#include<stdio.h>
#include<ctype.h>

int main(){

int z;
char tablica2[30] = "123",
tablica1[30] = "123 321";

if(tablica2[3]==0)z=2;
printf("tablica2[3] = %i
", tablica2[3]);
if(tablica1[3]==0)z=0;
printf("tablica1[3] = %i
", tablica1[3]);
if(isspace(tablica1[3]))z=1;

printf("%i
",z);

}
tutaj spacja = 32
ODPOWIEDZ