Skocz do zawartości

[C] tablica ciagow


phpion.com

Polecane posty

Witam!
Spotkalem sie z kolejnym problemem. Otoz, jak zrobic cos takiego. Uzytkownik podczas pracy z programem wpisuje kolejne zapytania SQL ktore chce wykonac. Zapytania te chcialbym zapisywac do tablicy; calosc by wygladala np. tak:
KODtab[0] = "SELECT * FROM tabela";

tab[1] = "DELETE * FROM tabela";
czyli pamietalbym np. 5 ostatnio wykonanych zapytan. I teraz moje pytanie: jak zapamietac w tablicy w C stringi? Napisalem cos takiego (dla testow wczytywania):
KOD#include <stdio.h>



main()

{

char tab[3], temp;

int i;



for (i=0; i<3; i++)

{

scanf("%s", temp);

printf("%s", temp);

tab[i] = temp;

}



printf("n");



for (i=0; i<3; i++)

{

printf("%sn", tab[i]);

}



getchar();

return 0;

}
ale to nie za bardzo dziala... wywala Segmentation fault.
Link do komentarza
Udostępnij na innych stronach

Po pierwsze zle chcesz przechowywac stringi: char to tylko 1 znak.
Mozesz zrobic tak np.
#define MAX_BUFF 128
...
char tab[5][MAX_BUFF]; // bo chciales miec zapamietywane 5 ostatnich

teraz mozesz:
sprintf("%s", &tab[i]);

a i jeszcze jedno, stringi nie przypisuje sie za pomoca operatora: =
do tego sluzy odpowiedia funkcja: strcpy(), wiecej w MSDN/Google.

Zaraz posypie sie jeszcze wiecej pytan jesli nie poduczysz sie C, a tego admini moga juz nie wytrzymac wink.gif

Link do komentarza
Udostępnij na innych stronach

Wachu - cos nie tak z twoim przykladem, albo z moim:
KODchar pamiec[5][255];

int i;



for (i=0; i<5; i++)

sprintf("%s", &pamiec[i]);



printf("n");



for (i=0; i<5; i++)

printf("%sn", pamiec[i]);
wywala:
KODtest.c: In function `main':

test.c:13: warning: passing arg 2 of `sprintf' from incompatible pointer type
Gdy dane wczytam przez scanf to do tablicy wchodza nie cale wersy zapytan ale jakby pojedyncze slowa :/ Dlaczego to C jest takie glupie?!

// nie męcz sie z C tylko przejdź na C++ - Iskar
Link do komentarza
Udostępnij na innych stronach

pomylilo mi sie, oczywiscie chodzilo o scanf(); a jesli chcesz wc zytywanie calych lini razem ze spacjami to polecam: gets(); w MSDN znajdziesz wiecej podobnych funkcji.

Btw. C++ tez nie rozwiazuje tych problemow jesli nie zna sie odpowiednich funkcji, wiec problem lezy raczej w niewiedzy niz w kulawosci jezyka smile.gif

Link do komentarza
Udostępnij na innych stronach

[quote] [code=C++] #define MAX_BUFF 128
(...)
char tab[5][MAX_BUFF];
(...)
[ [XWJNB&((<,+ĘJ\"zć}~Z0<ł73j7+ZŚĆŁzsu%j0jvjh'ś0ĘfĄĄz'3'ł<ŹśJ#yb<'Fw8'&-z
.Ę0yo)r$4(5a} U4(M5a} Upp4)ĄŃm][MAX_BUFF];
scanf(\"%\"S_MAX_BUFF\"s\", &tab[i]);
[/code] [/quote]

jaro twoj kod tez teoretycznie moze zrobic wszystko smile.gif

Calkowicie bezpiecznie to powinno byc tak:
KOD#define MAX_BUFF 128

#define SMAX_BUFF "128"

char tab[5][MAX_BUFF];

scanf("%"S_MAX_BUFF"s", &tab[i]);

tab[i][MAX_BUFF-1] = '0';

Bo jak ktos przekroczy rozmiar bufora to i tak na koncu nie bedziesz mial a wiec pierwsa lepsza operaca na tym stringu sie sypnie.

Link do komentarza
Udostępnij na innych stronach

  • 3 years later...

[quote name='Bolek' post='1110' date='pią, 13 sty 2006 - 11:17']
jaro twoj kod tez teoretycznie moze zrobic wszystko smile.gif
Calkowicie bezpiecznie to powinno byc tak:
[code=C++] #define MAX_BUFF 128

#define SMAX_BUFF "128"

char tab[5][MAX_BUFF];

scanf("%"S_MAX_BUFF"s", &tab[i]);

tab[i][MAX_BUFF-1] = '0';$#jI-Ęk+Ąć+j\"'jJ'ry'Źhyv)ęą^ŚiĆjŚŹ2Śxękj^O
#j)Ź$j$jezo7n^ZĆŚjŚjH)Ż7')]XWVÓPVQLWHH N N [/code]
Polecam przeanalizowanie powyższego fragmentu Twojego kodu i pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...