Προς το περιεχόμενο

Απορια με strings στην C!!!


taleporos09

Προτεινόμενες αναρτήσεις

Δημοσ.

Θελω να φτιαξω ενα προγραμμα σε c που θα χρησιμοποιει εναν πινακα πχ.Foods(αγνωστου αριθμου θεσεων) που θα βαζει λεξεις(φαγητα) απο τον χρηστη(οσες θελει αυτος) πχ Foods[0]=PASTITSIO,Foods[1]=MOYSAKAS κλπ...

 

Ο αριθμος των φαγητων ειπαμε θα ειναι αγνωστος...(????) πως θα το κανω αυτο..πλζζζ χελπ ειμαι αρχαριος (βασικα με μπερδευουν και τα αλφαριθμητικα...και η μαλλοκ με την δυναμικη αναθεση μνημης...)

 

Μπορει καποιος σας παρακαλω να μου δωσει ενα παραδειγμα...ή εστω μια υποτυπωδης λυση...εχω πελαγωσει....

 

Eυχαριστω εκ των προτερων

Δημοσ.

Μηπως ενοοει οτι το μεγεθος του πινακα θα το οριζει μονος του ο χρηστης?

π.χ

 

int SIZE;

int i;

 

printf("dose ton arithmo fagiton:\n");

scanf("%i",&SIZE);

 

char Foods;

 

και μετα θα δινει ο χρηστης απ το πληκτρολογιο οσα φαγητα θελει

Δημοσ.

πρεπει να ειναι C?

αν επιτρεπεται να ειναι και C++ μπορεις να χρησιμοποιησεις ενα vector απο strings

 

αλλιως πρεπει να φτιαξουμε μια custom δομη

Δημοσ.
Μηπως ενοοει οτι το μεγεθος του πινακα θα το οριζει μονος του ο χρηστης?

π.χ

 

int SIZE;

int i;

 

printf("dose ton arithmo fagiton:\n");

scanf("%i",&SIZE);

 

char Foods;

 

και μετα θα δινει ο χρηστης απ το πληκτρολογιο οσα φαγητα θελει

 

Αυτο γινεται? Μπορεις να μου πεις ακριβως πως να το κανω γτ δν ξερω απο αλφαριθμητικα?

 

Βασικα αυτο που θελω ειναι να λεει:πχ ΠΑΣΤΙΤΣΙΟ,ΟΜΕΛΕΤΑ,ΜΑΚΑΡΟΝΙΑ, 0 και οταν δωσει 0 να σταματησει αλλα αν γινεται το 0 να μην μπει στον πινακα αν δεν γινεται αρκουμε στην παραπανω λυση...

 

Μηπως ομως θα μπορουσες να γραψεις σε παρακαλω ανλυτικοτερα τον κωδικα πχ αν ειναι τυπου char Foods; θα μπορει να βαλει size φαγητα ή size χαακτηρες ?

 

πρεπει να ειναι C?

yeap!!!

 

Ευχαριστω!!!

Δημοσ.

Πρόχειρο προγραμματάκι με την χρήση της malloc και realloc:

 

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

#define NAME_LENGTH 256

int main(void)
{
   char ** food_list = NULL;
   char input[NAME_LENGTH];
   int count = 0;
   int i;

   fprintf(stderr, "new food ?:");

   while (fgets(input, NAME_LENGTH-1, stdin) != NULL)
   {
       if (count == 0)
       {
           food_list = (char **)malloc(sizeof(char*)*(count+1));
       }
       else
       {
           char ** new_food_list = NULL;

           new_food_list = (char **)realloc(food_list, sizeof(char*)*(count+1));
           food_list = new_food_list;
           
       }
       food_list[count] = strdup(input);
       count++;

       for(i=0;i<count;i++)
           fprintf(stderr, "food_list[%d] = %s\n", i, food_list[i]);

       fprintf(stderr, "new food ?:");
   }

   return 0;
}

Δημοσ.
Πρόχειρο προγραμματάκι με την χρήση της malloc και realloc:

 

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

#define NAME_LENGTH 256

int main(void)
{
   char ** food_list = NULL;
   char input[NAME_LENGTH];
   int count = 0;
   int i;

   fprintf(stderr, "new food ?:");

   while (fgets(input, NAME_LENGTH-1, stdin) != NULL)
   {
       if (count == 0)
       {
           food_list = (char **)malloc(sizeof(char*)*(count+1));
       }
       else
       {
           char ** new_food_list = NULL;

           new_food_list = (char **)realloc(food_list, sizeof(char*)*(count+1));
           food_list = new_food_list;
           
       }
       food_list[count] = strdup(input);
       count++;

       for(i=0;i<count;i++)
           fprintf(stderr, "food_list[%d] = %s\n", i, food_list[i]);

       fprintf(stderr, "new food ?:");
   }

   return 0;
}

 

επειδη ομολογω σε εχασα καπου μηπως μπορεις να μου πεις λιγο ταχιστα τι κανει το προγραμμα, με ποιο τροπο λειτουργει? Συγγνωμη αν σε κουραζω αλλα τωρα ξεκινω το ταξιδι στον μαγικο κοσμο του προγραμματισμου... ;)

Δημοσ.
πρεπει να ειναι C?

αν επιτρεπεται να ειναι και C++ μπορεις να χρησιμοποιησεις ενα vector απο strings

 

αλλιως πρεπει να φτιαξουμε μια custom δομη

 

Επειδή και εγώ θέλω να κάνω κάτι παρόμοιο: Θα λέει ο χρήστης τα ονόματα Χ παιδιών και εγώ θα πρέπει να τα βάζω σε ξεχωριστά X string και δεν ξέρω πως θα το κάνω :-( με βοηθάς λίγω στην C++ :rolleyes:

Δημοσ.
>
#include <stdlib.h>
#include <stdio.h>

#define NAME_LENGTH 256

int main(void)
{
   char ** food_list = NULL; /* κενός πίνακας (δείκτης) από char * στοιχεία */
   char input[NAME_LENGTH]; /* στοιχείο χρήστη μέγιστου μήκους ίσο με NAME_LENGTH */
   int count = 0; /* πλήθος στοιχείων πίνακα food_list */
   int i;

   fprintf(stderr, "new food ?:"); /* ερώτηση πρός τον χρήστη */

   /* διάβαζε συνέχεια απο τον χρήστη strings μέγιστου μήκους
      NAME_LENGTH-1, και αποθήκευσε τα στην input μεταβλητή 
      κάθε φορά */
   while (fgets(input, NAME_LENGTH-1, stdin) != NULL) 
   {
       if (count == 0) /* εάν είναι η πρώτη φορά, (0 στοιχεία) */
       {
            /* κατοχύρωσε την μνήμη δυναμικά ποσότητα ίση με 
               το μέγεθος ενός char * στοιχείου */
           food_list = (char **)malloc(sizeof(char*)*(count+1));
       }
       else
       {
           char ** new_food_list = NULL;
           /* ανακατοχύρωσε δυναμικά την προηγούμενη μνήμη προσθέτοντας 
              το μέγεθος ενός επιπλέον char * στοιχείου (χωρίς να αλλάξουν τα
              περιεχόμενα της υπάρχουσας μνήμης) */
           new_food_list = (char **)realloc(food_list, sizeof(char*)*(count+1));
           food_list = new_food_list;
           
       }
       /* εναπόθεσε στη θέση count του πίνακα food_list το στοιχείο του χρήστη.
          εδώ υπάρχει μια κρυμένη malloc η οποία γίνεται (και επιστρέφεται) από την [url="http://linux.die.net/man/3/strdup"]strdup[/url]
          διότι ένα στοιχείο του πίνακα food_list είναι στη ουσία ένα char *
        */
       food_list[count] = strdup(input);
       count++; /* άυξησε το πλήθος των στοιχείων */

       /* εκτύπωσε την λίστα */
       for(i=0;i<count;i++)
           fprintf(stderr, "food_list[%d] = %s\n", i, food_list[i]);

       fprintf(stderr, "new food ?:"); /* ερώτηση πρός τον χρήστη (ξανά) */
   }

   /* στην ουσία το πρόγραμμα δεν τερματίζει ποτέ */

   return 0;
}

Δημοσ.
>
#include <stdlib.h>
#include <stdio.h>

#define NAME_LENGTH 256

int main(void)
{
   char ** food_list = NULL; /* κενός πίνακας (δείκτης) από char * στοιχεία */
   char input[NAME_LENGTH]; /* στοιχείο χρήστη μέγιστου μήκους ίσο με NAME_LENGTH */
   int count = 0; /* πλήθος στοιχείων πίνακα food_list */
   int i;

   fprintf(stderr, "new food ?:"); /* ερώτηση πρός τον χρήστη */

   /* διάβαζε συνέχεια απο τον χρήστη strings μέγιστου μήκους
      NAME_LENGTH-1, και αποθήκευσε τα στην input μεταβλητή 
      κάθε φορά */
   while (fgets(input, NAME_LENGTH-1, stdin) != NULL) 
   {
       if (count == 0) /* εάν είναι η πρώτη φορά, (0 στοιχεία) */
       {
            /* κατοχύρωσε την μνήμη δυναμικά ποσότητα ίση με 
               το μέγεθος ενός char * στοιχείου */
           food_list = (char **)malloc(sizeof(char*)*(count+1));
       }
       else
       {
           char ** new_food_list = NULL;
           /* ανακατοχύρωσε δυναμικά την προηγούμενη μνήμη προσθέτοντας 
              το μέγεθος ενός επιπλέον char * στοιχείου (χωρίς να αλλάξουν τα
              περιεχόμενα της υπάρχουσας μνήμης) */
           new_food_list = (char **)realloc(food_list, sizeof(char*)*(count+1));
           food_list = new_food_list;
           
       }
       /* εναπόθεσε στη θέση count του πίνακα food_list το στοιχείο του χρήστη.
          εδώ υπάρχει μια κρυμένη malloc η οποία γίνεται (και επιστρέφεται) από την [url="http://linux.die.net/man/3/strdup"]strdup[/url]
          διότι ένα στοιχείο του πίνακα food_list είναι στη ουσία ένα char *
        */
       food_list[count] = strdup(input);
       count++; /* άυξησε το πλήθος των στοιχείων */

       /* εκτύπωσε την λίστα */
       for(i=0;i<count;i++)
           fprintf(stderr, "food_list[%d] = %s\n", i, food_list[i]);

       fprintf(stderr, "new food ?:"); /* ερώτηση πρός τον χρήστη (ξανά) */
   }

   /* στην ουσία το πρόγραμμα δεν τερματίζει ποτέ */

   return 0;
}

 

thanx φιλε η βοηθεια σου ηταν υπερπολιτιμη...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...