C - input - συμβολοσειρά απεριόριστου μεγέθους

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό medigeek » 24 Μαρ 2011, 11:24

1. Πως θέτω ένα string με unlimited size (απεριόριστο μέγεθος) σε γλώσσα C; Ρωτάω επειδή σύμφωνα με άρθρο του bbc το ονοματεπώνυμο πρέπει να είναι.. αρκετά μεγάλο. :P

2. Σε άλλες γλώσσες προγραμματισμού, όπως Python ή Perl που είναι dynamic, πόσο είναι το μεγιστο (θεωρητικό) μέγεθος ενός string; Έχει σχέση με το μέγεθος της μνήμης και με την αρχιτεκτονική 32-bit/64-bit;
Τελευταία επεξεργασία από medigeek και 24 Μαρ 2011, 17:16, έχει επεξεργασθεί 1 φορά/ες συνολικά
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: C - input - unlimited string length?

Δημοσίευσηαπό konnn » 24 Μαρ 2011, 12:20

medigeek έγραψε:Πως θέτω ένα string με unlimited size (απεριόριστο μέγεθος) σε γλώσσα C; Ρωτάω επειδή σύμφωνα με άρθρο του bbc το ονοματεπώνυμο πρέπει να είναι.. αρκετά μεγάλο.

Απίστευτο.....
medigeek έγραψε:Σε άλλες γλώσσες προγραμματισμού, όπως Python ή Perl που είναι dynamic, πόσο είναι το μεγιστο (θεωρητικό) μέγεθος ενός string; Έχει σχέση με το μέγεθος της μνήμης και με την αρχιτεκτονική 32-bit/64-bit;

Υποθέτω πως ορίζεις ένα δείκτη σε πίνακα char με αρχικό μέγεθος π.χ Length=NULL(μάλλον δεν ορίζεις καθόλου μέγεθος απλά το Length θα παίξει το ρόλο του μεγέθους) όπου το τελευταίο συγκρίνεται με το όνομα του επιβάτη και γίνεται copy στον πίνακα τον αρχικό.....περίπου.
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: C - input - unlimited string length?

Δημοσίευσηαπό medigeek » 24 Μαρ 2011, 15:53

konnn έγραψε:
Υποθέτω πως ορίζεις ένα δείκτη σε πίνακα char με αρχικό μέγεθος π.χ Length=NULL(μάλλον δεν ορίζεις καθόλου μέγεθος απλά το Length θα παίξει το ρόλο του μεγέθους) όπου το τελευταίο συγκρίνεται με το όνομα του επιβάτη και γίνεται copy στον πίνακα τον αρχικό.....περίπου.

Ευχαριστώ! Βρήκα μια ερώτηση στο stackoverflow, φαίνεται πως έχει σχέση με την αρχιτεκτονική και το μέγεθος της μνήμης: http://stackoverflow.com/questions/1739 ... hon-string

Το θέμα τώρα είναι πως το κάνω string με απεριόριστο μέγεθος σε γλώσσα C. Ένα παράδειγμα; :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: C - input - unlimited string length?

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 16:14

1. Θα ήταν καλό να αλλάξεις τον τίτλο σε κάτι στα ελληνικά
2. Για το μέγεθος αλφαριθμητικών που θέλεις να είναι μεγάλο, χρησιμοποιείς ειδικές τεχνικές ανάλογα με την περίσταση.

Για C++ έχεις ένα αντικείμενο string που αυτόματα μεγαλώνει ανάλογα με το μέγεθος που δίνεις.
Οπότε, κάνεις κάτι τέτοιο σε C.

Δεν έχει νόημα να φτιάξεις ένα πίνακα με τεράστιο στατικό μέγεθος, μόνο και μόνο για την περίπτωση που μπορεί να χρησιμοποιηθεί.
Αυτό που κάνεις είναι δυναμικά ζητάς τη μνήμη που χρειάζεται.

Υπάρχουν πάντα ζητήματα με το πόση μνήμη θα χρειαστείς. Με αλλαγή του αλγορίθμου μπορείς να τα ξεπεράσεις.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό medigeek » 24 Μαρ 2011, 18:41

Off topic:
simosx έγραψε:1. Θα ήταν καλό να αλλάξεις τον τίτλο σε κάτι στα ελληνικά

Πάντα μου φαινόταν παράξενη η ορολογία στα ελληνικά. :)


simosx έγραψε:Αυτό που κάνεις είναι δυναμικά ζητάς τη μνήμη που χρειάζεται.
Υπάρχουν πάντα ζητήματα με το πόση μνήμη θα χρειαστείς. Με αλλαγή του αλγορίθμου μπορείς να τα ξεπεράσεις.


Αν κατάλαβα καλά, σε C++ γίνεται με το std::string
Κώδικας: Επιλογή όλων
#include <iostream>
#include <string>
using namespace std;

int main ()
{
std::string mystring;

cout << "Please enter your name: ";
std::getline(std::cin, mystring);

cout << "Your name is: " << mystring << endl;
}


Σε C δεν είμαι σίγουρος, αλλά αυτό δούλεψε:
Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(){
char *line = NULL;
size_t len = 0;
size_t read = 0;

printf("Please enter your name: ");
read = getline(&line, &len, stdin);
printf("Your name is: %s\n", line);

return(0);
}
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 19:10

Κώδικας: Επιλογή όλων
char *line = NULL;
read = getline(&line, &len, stdin);


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

Ο τρόπος επίλυσης;

Θέλεις είσοδο κειμένου από το τερματικό. Το τερματικό επιβάλει κάποιο όριο, και νομίζω ότι υπάρχει σταθερά MAX_LENGTH ή κάτι τέτοιο στο stdio.h ή στο unistd.h (ψάξε). Οπότε, για είσοδο από το τερματικό, γνωρίζεις το μέγιστο που μπορεί να μπει, και φτιάχνεις έναν ενταμιευτή (buffer) για να λαμβάνει τέτοιες τιμές. Φυσικά, μόλις λάβεις την τιμή, την αντιγράφεις κάπου αλλού, για να χρησιμοποιήσεις το μεγάλο ενταμιευτή ξανά, για άλλη εισαγωγή από το τερματικό.

Όταν γράφεις σε μνήμη που κανονικά δεν πρέπει, μπορεί να έχεις παράξενες επιπτώσεις.
Δες για παράδειγμα το viewtopic.php?f=61&t=17612 και προσπάθησε να εξηγήσεις γιατί δουλεύει το πρόγραμμα με τον τρόπο που λειτουργεί.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό medigeek » 24 Μαρ 2011, 21:47

Χμ.. μπαίνουμε σε πολύ βαθιά (για μένα) νερά, καλύτερα να κανουμε μια μικρή παύση και να το αφήσουμε για πιο μετά -- ήδη αυτά που κατάφερα ήταν μισό copy-paste, μισά δικά μου από διάβασμα οδηγών... :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό medigeek » 24 Μαρ 2011, 22:09

Μήπως αυτό;

Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(){
char input[] = "";
char *line = input;
size_t len = 0;
size_t read = 0;

printf("Please enter your name: ");
read = getline(&line, &len, stdin);
printf("Your name is: %s\n", line);

return(0);
}


string array μέσω pointer; :?
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 22:16

medigeek έγραψε:Χμ.. μπαίνουμε σε πολύ βαθιά (για μένα) νερά, καλύτερα να κανουμε μια μικρή παύση και να το αφήσουμε για πιο μετά -- ήδη αυτά που κατάφερα ήταν μισό copy-paste, μισά δικά μου από διάβασμα οδηγών... :)


Έριξα μια ματιά και είναι αρκετά πιο εύκολο.
Κώδικας: Επιλογή όλων
#include <stdio.h>

int main()
{
char string1[20];

puts ("Please enter a string of 20 characters or fewer.");
scanf ("%20s", string1);
printf ("\nYou typed the following string:\n%s\n\n", string1);

return 0;
}


Αυτό που κάνεις είναι να καθορίσεις στην scanf() το μέγιστο μέγεθος που απαιτείς.
Έτσι, μπορείς να θέσεις όρια σε αυτά που εισάγονται στο πρόγραμμά σου.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: C - input - συμβολοσειρά απεριόριστου μεγέθους

Δημοσίευσηαπό medigeek » 24 Μαρ 2011, 22:37

Ναι αυτό το γνωρίζω, το πρόβλημα με το scanf είναι ότι σταματάει στο πρώτο space χαρακτήρα. Άσε που περιορίζεται σε συγκεκριμένο αριθμό χαρακτήρων πριν το compile.

Αυτό που θα ήθελα είναι:
έγραψε:Αυτό που κάνεις είναι δυναμικά ζητάς τη μνήμη που χρειάζεται.


Είναι υποθετική περίπτωση, δεν το χρειάζομαι προσωπικά ούτε για δουλειά, απλά με ενδιαφέρει αν γίνεται να υπάρχει κάτι το ίδιο με αυτό στο python: να δέχεται input χαρακτήρες επ' απειρον (απειρο εννοώ μέχρι σ'ένα σημείο, λόγω μνήμης ή όπως είπες στο μέγιστο αριθμό χαρακτήρων που επιτρέπει το MAX_LENGTH του τερματικού).

Δηλαδή το size_t θα δημιουργήσει πρόβλημα;
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Επόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι