Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #define C_BUFFER 50
- #define MAX_WORDS 100
- /* void-osoitin voi olla minkä tyyppinen vain. Tyypin kokoa johon se osoittaa
- * ei tiedetä, eikä tässä tarvitsekaan, jos tiedetään minkä kokoisia osoittimet
- * ovat (kokonaislukuja johonkin muistiosoitteeseen). Vaihdetaan siis vain
- * osoitinmuuttujien sisältö keskenään laittamalla tälle funktiolle osoitinten
- * osoitteet. Argumenttien räpeltäminen suoraan ei onnistu, koska argumenteistä
- * tehdään funktiokutsua varten kopiot. Siispä homma täytyy hoitaa
- * pointterikikkailulla. Jos osaat pointterit, osaat C:tä. */
- void swap(void *a, void *b)
- {
- void *tmp = a;
- a = b;
- b = tmp;
- }
- int main(void)
- {
- int c, d, nth_c, i, nth_w; /* c = luettu merkki; nth_c = monesko merkki sanassa */
- char cbuf[C_BUFFER]; /* puskuri luetulle sanalle. Sana ei voi olla pidempi. */
- char *sanat[MAX_WORDS]; /* puskuri sanoille. Sanoja ei voi olla enempää. */
- char **sekaseka;
- char *sana;
- nth_c = 0;
- nth_w = 0;
- while ((c=getchar()) != EOF)
- {
- if(c==' '||c=='\n')
- {
- /* merkkijonot ovat nollaterminoituja '\0', ja calloc
- * alustaa valmiiksi muistialueen. Operaattori sizeof
- * antaa tyypin koon. */
- sana = calloc(nth_c+1, sizeof(char));
- strncpy(sana, cbuf, sizeof(char)*nth_c);
- sanat[nth_w] = sana;
- nth_w++;
- nth_c = 0;
- }
- else
- {
- cbuf[nth_c] = c;
- nth_c++;
- }
- }
- /* tehdään kopio sanalistasta, ja sekoitetaan sen osoittimet. */
- sekaseka = malloc(sizeof(char**)*nth_w);
- memcpy(sekaseka, sanat, sizeof(char**)*nth_w);
- for (i = 0; i < nth_w; i++)
- {
- sekaseka[i] = sanat[i];
- }
- /* sekaseka */
- srand((unsigned int)(time(NULL)/2)); /* käytetään aikaa siemenenä */
- for (i = 0; i < nth_w*10; i++)
- {
- c = rand() % nth_w;
- d = rand() % nth_w;
- swap(&(sekaseka[c]), &(sekaseka[d]));
- }
- for (i = 0; i < nth_w; i++)
- {
- printf("%s ", sekaseka[i]);
- }
- printf("\n");
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment