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

έχω κολλήσει με τα strings in C


maniac89

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

Δημοσ.

παιδιά κοιτάξτε το παρακάτω απλό προγραμματάκι,το μονο που θέλω να κάνω είναι να εμφανίσω καποια ονόματα σε λίστα....μπερδεύομαι όμως με τα strings.

προκαταβολικά thanks!!!

 

#include <stdio.h>

 

struct node {

char name;

struct node *next;

};

 

struct node *root;

 

int main(int argc,char* argv[]) {

struct node *list;

list=(struct node*)malloc(sizeof(struct node));

list->name='Kostas'; //κάπου εδώ το χάνω

list->next=NULL;

root=list;

for(list=root;list!=NULL;list=list->next) {

printf("%s\n",list->name);

}

return 0;

}

Δημοσ.

Το char μπορεί να κρατήσει μόνο έναν χαρακτήρα, οπότε θα πρέπει να αλλάξεις το char name σε char *name. Επίσης, τα ' (single quotes) χρησιμοποιούνται μόνο για έναν χαρακτήρα, για string θα πρέπει να χρησιμοποιήσεις " (double quotes), οπότε θα γίνει list->name="Kostas".

Το υπόλοιπο πρόγραμμα δεν το κοίταξα, πάντως το πρόβλημα με τα strings πιστεύω αυτό είναι.

Δημοσ.

Θα πρέπει καταρχήν να δεσμεύσεις ικανό χώρο στο node.name ώστε να χωρά το προς αποθήκευση όνομα (το ορίζω στατικά ως BUFSIZ από stdio.h -μια αρκετά μεγάλη τιμή, αν θες το κάνεις φυσικά και δυναμικά με το ανάλογο malloc).

Ύστερα θα πρέπει να αποθηκεύσεις το όνομα "Kostas" (με " και όχι ') στο name, αυτό μπορεί να γίνει στην περίπτωση μας με την strcpy.

Τέλος αποδεσμεύουμε την μνήμη που δεσμεύουμε (είθισται..) και ελέγχουμε πάντα για επιτυχία ή αποτυχία της malloc.

 

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

struct node
{
   char name[bUFSIZ];
   struct node *next;
};

struct node *root;

int main(int argc,char* argv[])
{
   struct node *list = NULL;
   list=(struct node*)malloc(sizeof(struct node));
   if(list != NULL)
    {
       strcpy(list->name, "Kostas");

       list->next=NULL;
       root=list;


       for(list=root;list!=NULL;list=list->next)
           printf("%s\n",list->name);
    }

   free(list);

   return 0;
}

 

Καλή συνέχεια.

 

Υ.Γ.

Με πρόλαβε ο Aesmade :)

Δημοσ.

Αν το έκανες με char array, όπως στον κώδικα του Directx, δεν γίνεται απλώς να του κάνεις assign τη διεύθυνση ενός string. Θα πρέπει να χρησιμοποιήσεις έναν char pointer.

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

struct node {
char *name;
struct node *next;
};

struct node *root;

int main(int argc,char* argv[]) {
struct node *list;
list=(struct node*)malloc(sizeof(struct node));
list->name="Kostas";
list->next=NULL;
root=list;
for(list=root;list!=NULL;list=list->next) {
printf("%s\n",list->name);
}
return 0;
}

Δημοσ.

Προσπάθησε να χρησιμοποιείς την strcpy και όχι απλά mypointer = "mystring"

Μερικές φορές η συμπεριφορά του προγραμματος μπορεί να είναι απρόβλεπτη.

Ίσως ο compiler αντιλαμβάνεται το "mystring" σαν const το οποίο εσυ το συνδέεις με εναν non to-const pointer.. οπώτε ίσως υπάρξουν προβλήματα άμα πάς στην συνέχεια να πειράξεις ένα γράμμα του string για παράδειγμα...

Για να βγάλουμε λοιπόν όλα αυτά τα "ισως", "μερικές φορές", "μπορεί" κτλ απλά ... strcpy ftw

Δημοσ.
(γιατί άμα βάλω list->name="Kostas"; δεν το δέχεται?)

(μόνο με την strcpy γίνεται??) ευχαριστώ....

char --> 256 σινδιασμοι

Kostas - 26^6 σινδιασμοι

πρεπει να ειναι char[10](καλυτερα παντος ειναι να χρισιμοποιηση το BUFSIZ για να μην υπαρχουν ασκοπα bytes )

Δημοσ.
char --> 256 σινδιασμοι

Kostas - 26^6 σινδιασμοι

πρεπει να ειναι char[10](καλυτερα παντος ειναι να χρισιμοποιηση το BUFSIZ για να μην υπαρχουν ασκοπα bytes )

Οι arrays είναι σαν constant pointers, δεν μπορείς απλώς να δώσεις καινούρια διεύθυνση σε μια array. Και να μπορούσες, το μέγεθος της array δεν θα μέτραγε, αφού θα της έδινες καινούρια διεύθυνση.

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

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

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