freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [11 Μηνύματα]       Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
prokopios


Μέλος από: 17 Φεβ 2006
Μηνύματα: 155

View users profile
ΜήνυμαΣτις: 14 Νοε 2009 16:35    Θέμα: Βοήθεια με επιστροφή πίνακα από συναρτηση Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σας,
προσπαθώ να δημιουργήσω μια συνάρτηση η οποία θέλω να ζητάει από τον χρήστη ένα 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 Ιουν 2009
Μηνύματα: 17

View users profile
ΜήνυμαΣτις: 14 Νοε 2009 18:00    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

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

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

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

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

void get_str (char *s)
...


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

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


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


Μέλος από: 18 Φεβ 2009
Μηνύματα: 256+
Περιοχή: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ
View users profile
ΜήνυμαΣτις: 14 Νοε 2009 18:06    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

κώδικας:



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

char* get_str();
   
   
int main(){
    char str[50];
   strcpy(str,get_str());
   printf("\n edoses string=%s",str);
   system("pause");
   return 0;
}

char* get_str(){
   char *ptr,str[50];
   ptr=str;
   printf("\nenter string:");
   scanf ("%s",ptr);
  return ptr;
}

prokopios


Μέλος από: 17 Φεβ 2006
Μηνύματα: 155

View users profile
ΜήνυμαΣτις: 14 Νοε 2009 18:16    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

_________________
ΑΥΤΑ!!!
kaveirious


Μέλος από: 17 Ιουν 2009
Μηνύματα: 17

View users profile
ΜήνυμαΣτις: 15 Νοε 2009 01:21    Θέμα:
Περιγραφή θέματος: Get string
Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 18 Φεβ 2009
Μηνύματα: 256+
Περιοχή: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ
View users profile
ΜήνυμαΣτις: 15 Νοε 2009 02:15    Θέμα:
Περιγραφή θέματος: Get string
Απάντηση με παράθεση  Mark this post and the followings unread

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

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 15 Νοε 2009 02:26    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Είμαστε εδώ για να ρωτάμε αυτά που δεν ξέρουμε και να μας απαντάνε αυτοί που ξέρουν και αυτοί που ίσως να ξέρουν ή έχουν κάποια ιδέα που μπορεί να μας ξεκολλήσει.
Δεν βλέπω για ποιό λόγο να περιμένουμε τη βοήθεια από επαγγελματίες, αν και πότε θα μας τη δώσουν.
Εξάλλου, παρόλο που θα το έβρισκα εξαιρετικά χρήσιμο να απαντούν οι επαγγελματίες, δε νομίζω πως είναι και πάρα πολλοί οι επαγγελματίες εδώ μέσα που ασχολούνται με C προγραμματισμό συγκριτικά με αυτούς που ασχολούνται με C#, PHP, Java.

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

Αν είναι να μην το πεις ή να δώσεις κάποιο link που να το εξηγεί, δεν έχει και πολύ νόημα να το αναφέρεις.

παράθεση:
λυπάμαι αλλά η λύση έχει σοβαρές ανεπάρκειες!!!

Ισως η λύση έχει προβλήματα και/η περιορισμούς. Κάποια ίσως να τα γνωρίζει και ο ίδιος κάποια ίσως όχι. Αν έχεις εντοπίσει κάτι ή έχεις να προτείνεις κάτι διαφορετικό (δεν είναι υποχρεωτικό να είναι καλύτερο, απλώς κάτι διαφορετικό), παρακαλούμε... Οπως είπες και ο ίδιος:
παράθεση:
Σε κάθε περίπτωση είμαι εδώ να σε βοηθήσω στα προβλήματα σου.
kaveirious


Μέλος από: 17 Ιουν 2009
Μηνύματα: 17

View users profile
ΜήνυμαΣτις: 15 Νοε 2009 03:15    Θέμα:
Περιγραφή θέματος: Get string
Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 16 Νοε 2009 22:22    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

κώδικας:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*char *get_str(){
     char *str;
     str=(char *)malloc(50);
     scanf("%s",str);
     return str;
} */

char *get_str(){
     char str[50];
     gets(str);
     return str;
}

int main(){
    char str[50];
    /*
    char *str;
    str=(char *)malloc(50);
    */
    strcpy(str,get_str()); /* str=get_str(); */
    puts(str);
    /* printf("%s\n",str); */
    system("pause");
    return 0;
}


Δύο λύσεις σε έναν κώδικα. Όσα είναι σε σχόλια είναι η μία λύση και όσα είναι κανονικά είναι η δεύτερη.

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

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

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

_________________
while(!dead()) ++knowledge;
Erevis


Μέλος από: 12 Ιουν 2008
Μηνύματα: 56
Περιοχή: Χαλάνδρι
View users profile
ΜήνυμαΣτις: 17 Νοε 2009 22:36    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

alex599 ανέφερε:
κώδικας:

char *get_str(){
     char str[50];
     gets(str);
     return str;
}





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

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

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


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 18 Νοε 2009 07:43    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

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

_________________
while(!dead()) ++knowledge;
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [11 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++


Σχετικά θέματα
 Θέματα   Απ/σεις   Αποστολέας   Τελευταίο μήνυμα 
δεικτης λιστας σε συναρτηση 1 poniroz 22 Μαη 2016 13:41
gvre Εμφάνιση τελευταίου μηνύματος
 
Τώρα είναι 08 Δεκ 2016 09:50 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos