Βοήθεια με επιστροφή πίνακα από συναρτηση

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
prokopios
Δημοσιεύσεις: 155
Εγγραφή: 17 Φεβ 2006 15:47

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από prokopios » 14 Νοέμ 2009 16:35

Γεια σας,
προσπαθώ να δημιουργήσω μια συνάρτηση η οποία θέλω να ζητάει από τον χρήστη ένα string και να το επιστρέφει.
Στη main θέλω οπωσδήποτε να το αποθηκεύω σε πίνακα.

Κώδικας: Επιλογή όλων

main()
{
   char str[50]; 

   str = get_str();
}

char *get_str ()
{
   char str[50];
  *ptr;

   printf("enter str");
   scanf ("%s",str); 

  *ptr = str; // ξέρω ότι είναι λάθος αλλα δεν ξέρω πως γίνεται
 
}
Μπορεί κάποιος να με βοηθήσει ?
Ευχαριστώ πολύ!
ΑΥΤΑ!!!

kaveirious
Δημοσιεύσεις: 17
Εγγραφή: 17 Ιουν 2009 15:49

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από kaveirious » 14 Νοέμ 2009 18:00

Φίλε Προκόπη,

θα χρειαστείς σημαντική βοήθεια, αν έχεις τόσο θεμελιώδεις απορίες. Αν είσαι αρχάριος είναι ΟΚ, αλλιώς πρέπει να αναθεωρήσεις την τακτική σου.

Σε κάθε περίπτωση είμαι εδώ να σε βοηθήσω στα προβλήματα σου.

Μερικά tips μόνο για την ώρα.

1. Η χρήση της scanf δεν βοηθάει. Χρειάζεται να γράψεις κώδικα με την getchar().

2. Δεν χρειάζεται να δώσεις τον πίνακα ως επιστρεφόμενο όρισμα. Μπορείς να κάνεις το εξής:

Κώδικας: Επιλογή όλων

void get_str (char *s)
...
3. Αυτό το σκέτο *ptr; που το είδες αλήθεια? Δεν είναι valid C αυτό...

Έχω ΕΤΟΙΜΗ ΤΗ ΛΥΣΗ σου (με πήρε γύρω στα 6 λεπτά της ώρας...)
Αν ενδιαφέρεσαι, ξέρεις τι να κάνεις. Στείλε μου PM ή email για τα περαιτέρω και θα δεις ότι σε συμφέρει -_^


Με εκτίμηση
Νικόλαος Καββαδίας
Διδάκτωρ Τμ. Φυσικής ΑΠΘ
nikolaos.kavvadias@gmail.com

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από virxen75 » 14 Νοέμ 2009 18:06

κάτι τέτοιο σου κάνει?

Κώδικας: Επιλογή όλων



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

char* get_str&#40;&#41;;
   
   
int main&#40;&#41;&#123;
    char str&#91;50&#93;;
   strcpy&#40;str,get_str&#40;&#41;&#41;;
   printf&#40;"\n edoses string=%s",str&#41;;
   system&#40;"pause"&#41;;
   return 0;
&#125;

char* get_str&#40;&#41;&#123;
   char *ptr,str&#91;50&#93;;
   ptr=str;
   printf&#40;"\nenter string&#58;"&#41;;
   scanf &#40;"%s",ptr&#41;;
  return ptr; 
&#125;


prokopios
Δημοσιεύσεις: 155
Εγγραφή: 17 Φεβ 2006 15:47

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από prokopios » 14 Νοέμ 2009 18:16

Σας ευχαριστώ πάρα πολύ και τους 2 που απαντήσατε !
ΑΥΤΑ!!!

kaveirious
Δημοσιεύσεις: 17
Εγγραφή: 17 Ιουν 2009 15:49

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από kaveirious » 15 Νοέμ 2009 01:21

virxen75:

λυπάμαι αλλά η λύση έχει σοβαρές ανεπάρκειες!!!! Φαινομενικά αυτό που έδωσες δουλεύει, αλλά εντός πολύ σοβαρών περιορισμών, ενώ έχει και hole.

1. Τι στο καλό την χρειάζεσαι την κλήση συστήματος? Αν επρόκειται να εκτελεστεί το πρόγραμμα σε resource-constrained embedded system (έχω δουλέψει στην προτυποποίηση τέτοιων κυρίως γύρω από επεξεργασία/ανάλυση εικόνας) και δεν είχες host OS?

2. Η strcpy είναι unsafe, και υποφέρει από buffer overrun possibility καθώς δεν ορίζεις το μήκος του buffer. Κάνε strncpy με όριο π.χ. 100 ή 1000. Ή αλλιώς χωρίς strcpy-οειδή: buffαρε με ασφάλεια ότι δίνει ο χρήστης και στη συνέχεια φτιάξε το string εξόδου.

3. Ας μην πω καλύτερα για την ΤΡΥΠΑΡΑ που αφήνει η scanf.

Ας αφήνουμε τη βοήθεια σε επαγγελματίες.

-kaveirious

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από virxen75 » 15 Νοέμ 2009 02:15

kaveirious έγραψε:virxen75:

λυπάμαι αλλά η λύση έχει σοβαρές ανεπάρκειες!!!! Φαινομενικά αυτό που έδωσες δουλεύει, αλλά εντός πολύ σοβαρών περιορισμών, ενώ έχει και hole.

1. Τι στο καλό την χρειάζεσαι την κλήση συστήματος? Αν επρόκειται να εκτελεστεί το πρόγραμμα σε resource-constrained embedded system (έχω δουλέψει στην προτυποποίηση τέτοιων κυρίως γύρω από επεξεργασία/ανάλυση εικόνας) και δεν είχες host OS?

2. Η strcpy είναι unsafe, και υποφέρει από buffer overrun possibility καθώς δεν ορίζεις το μήκος του buffer. Κάνε strncpy με όριο π.χ. 100 ή 1000. Ή αλλιώς χωρίς strcpy-οειδή: buffαρε με ασφάλεια ότι δίνει ο χρήστης και στη συνέχεια φτιάξε το string εξόδου.

3. Ας μην πω καλύτερα για την ΤΡΥΠΑΡΑ που αφήνει η scanf.

Ας αφήνουμε τη βοήθεια σε επαγγελματίες.

-kaveirious

1. επειδή χρησιμοποιώ devcpp την βάζω απλά για να δω το αποτέλεσμα
αν έγραφα εφαρμογή θα το αφαιρούσα μετά την ολοκλήρωση της

2. αν δεις πιο προσεκτικά τον κώδικα έχει buffer 50

3. σωστό βάλε -->gets(ptr);

τώρα για το επαγγελματίες......ουδέν σχόλιο

κι αν δεν σου αρέσει μία λύση ευχαρίστως να δούμε την δική σου.

φιλικά
virxen75

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από dva_dev » 15 Νοέμ 2009 02:26

Είμαστε εδώ για να ρωτάμε αυτά που δεν ξέρουμε και να μας απαντάνε αυτοί που ξέρουν και αυτοί που ίσως να ξέρουν ή έχουν κάποια ιδέα που μπορεί να μας ξεκολλήσει.
Δεν βλέπω για ποιό λόγο να περιμένουμε τη βοήθεια από επαγγελματίες, αν και πότε θα μας τη δώσουν.
Εξάλλου, παρόλο που θα το έβρισκα εξαιρετικά χρήσιμο να απαντούν οι επαγγελματίες, δε νομίζω πως είναι και πάρα πολλοί οι επαγγελματίες εδώ μέσα που ασχολούνται με C προγραμματισμό συγκριτικά με αυτούς που ασχολούνται με C#, PHP, Java.
Ας μην πω καλύτερα για την ΤΡΥΠΑΡΑ που αφήνει η scanf.
Αν είναι να μην το πεις ή να δώσεις κάποιο link που να το εξηγεί, δεν έχει και πολύ νόημα να το αναφέρεις.
λυπάμαι αλλά η λύση έχει σοβαρές ανεπάρκειες!!!
Ισως η λύση έχει προβλήματα και/η περιορισμούς. Κάποια ίσως να τα γνωρίζει και ο ίδιος κάποια ίσως όχι. Αν έχεις εντοπίσει κάτι ή έχεις να προτείνεις κάτι διαφορετικό (δεν είναι υποχρεωτικό να είναι καλύτερο, απλώς κάτι διαφορετικό), παρακαλούμε... Οπως είπες και ο ίδιος:
Σε κάθε περίπτωση είμαι εδώ να σε βοηθήσω στα προβλήματα σου.

kaveirious
Δημοσιεύσεις: 17
Εγγραφή: 17 Ιουν 2009 15:49

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από kaveirious » 15 Νοέμ 2009 03:15

virxen75 έγραψε: χρησιμοποιώ devcpp
Χμμ... πιστεύω ότι θα αναγνωρίζεις ότι η devcpp είναι αλμπάνικο περιβάλλον.
virxen75 έγραψε: 2. αν δεις πιο προσεκτικά τον κώδικα έχει buffer 50
Το πρόσεξα. ΌΜΩΣ αποθηκεύεις το string στην τοπική στοίβα, καθόλου καλή ιδέα. Το μόνο που διευκολύνει κάπως την κατάσταση είναι ότι ο buffer που υλοποιείς παραείναι μικρός για να δημιουργήσει πρόβλημα. Σε μερικά desktop περιβάλλοντα και αναλόγως τον επεξεργαστή, θες buffer στα 16Κ και άνω για να μην μπορείς να κάνεις τα δεδομένα access μέσω PC-relative branch.

Και πάλι σε επεξεργαστές τύπου 8-bιτ (6502, Picoblaze κλπ) με πολύ μικρή local data ram θα έχεις πρόβλημα και με πολύ μικρότερους buffer από 16Κ. Σε αυτά τα περιβάλλοντα η global μνήμη είναι σε SDRAM ή NAND flash.
virxen75 έγραψε: 3. σωστό βάλε -->gets(ptr);
Είναι ιδιαίτερα σημαντικό security flaw η χρήση της gets. Χρησιμοποίησε fgets καλύτερα. Ή ακόμη καλύτερα ούτε gets ούτε fgets.
virxen75 έγραψε: τώρα για το επαγγελματίες......ουδέν σχόλιο
δική σου άποψη.

Οι λύσεις μου είναι ελεύθερες αλλά όχι πάντα δωρεάν.

-kaveirious

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από alex599 » 16 Νοέμ 2009 22:22

Κώδικας: Επιλογή όλων

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

/*char *get_str&#40;&#41;&#123;
     char *str;
     str=&#40;char *&#41;malloc&#40;50&#41;;
     scanf&#40;"%s",str&#41;;
     return str;
&#125; */

char *get_str&#40;&#41;&#123;
     char str&#91;50&#93;;
     gets&#40;str&#41;;
     return str;
&#125;

int main&#40;&#41;&#123;
    char str&#91;50&#93;;
    /* 
    char *str;
    str=&#40;char *&#41;malloc&#40;50&#41;; 
    */
    strcpy&#40;str,get_str&#40;&#41;&#41;; /* str=get_str&#40;&#41;; */
    puts&#40;str&#41;;
    /* printf&#40;"%s\n",str&#41;; */
    system&#40;"pause"&#41;;
    return 0;
&#125;
Δύο λύσεις σε έναν κώδικα. Όσα είναι σε σχόλια είναι η μία λύση και όσα είναι κανονικά είναι η δεύτερη.

Όσον αφορά τη διαμάχη, σε ένα forum που έχει σκοπό την εκμάθηση και επίλυση προβλημάτων, δεν χωρά εγωισμός, καλύτερα να φύγετε να πάτε αλλού. Και οι γνώσεις ενός phd σε σύγκριση με φοιτητές νομίζω δεν είναι ίσες και το να μας την "λέτε" δεν μας λέει τίποτα γιατί νομίζω πέφτει το επίπεδο σας.

Aν δεν έχετε σκοπό να μας βοηθήσετε τότε καλύτερα να μην απαντάτε στα μηνύματα.

ΣΧ: Συγγνώμη αν θεωρείται "επίθεση" τα σχόλια μου περί διαμάχης.[/code]
while(!dead()) ++knowledge;

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από Erevis » 17 Νοέμ 2009 22:36

alex599 έγραψε:

Κώδικας: Επιλογή όλων

char *get_str&#40;&#41;&#123;
     char str&#91;50&#93;;
     gets&#40;str&#41;;
     return str;
&#125;

Φίλε μου σίγουρα είναι σωστό αυτό? Γιατί επιστρέφει pointer σε μνήμη που έχει undefined περιεχόμενο μετά την κλήση της συνάρτησης.

Αν ναι, θέλω να μάθω το γιατί :D

Οσο για τον Phd, είναι τουλάχιστον αστείος.

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Βοήθεια με επιστροφή πίνακα από συναρτηση

Δημοσίευση από alex599 » 18 Νοέμ 2009 07:43

Για να σου πω την αλήθεια, ούτε εγώ περίμενα να τρέξει λόγω αυτού που είπες, η επιστροφή ενός δείκτη σε τοπική μεταβλητή δεν παίζει γενικά γιατί η μεταβλητή καταστρέφεται.

Ωστόσο εδώ έπαιξε αν και ο compiler (devcpp) moy έβγαλε warning. Η μόνη εξήγηση που μπορώ να δώσω είναι επειδή χρησιμοποιήθηκαν συναρτήσεις για τα string τόσο στη συνάρτηση όσο και στη main() για την απόδοση της επιστρεφόμενης από τη συνάρτηση τιμή στο string.

Η πρώτη μου λύση ήταν με τη δυναμική δέσμευση malloc() αλλά επείδη το πρόβλημα έλεγε να χρησιμοποιηθούν αναγκαστικά πίνακες, είπα μήπως έτρεχε έτσι και όντως έτρεχε.
while(!dead()) ++knowledge;

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες