Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
525 views

Έγραψα αυτό το απλό πρόγραμμα που δέχεται και τυπώνει πίνακα Ν χαρακτήρων. Δίνω κανονικά τον αριθμό Ν, όταν όμως αρχίσω να γράφω χαρακτήρες, στον πρώτο χαρακτήρα που δίνω το πρόγραμμα σταματάει. Τι πάει λάθος;

in progintro by (150 points)
edited by | 525 views
+1

Δεν καταλαβαίνω τι σημαίνει "το πρόγραμμα σταματάει". Σίγουρα όπως το έχεις γράψει διαβάζει το \n στο τέλος της γραμμής του αριθμού Ν ως τον πρώτο χαρακτήρα της συμβολοσειράς. Αλλά δε βλέπω γιατί να σταματάει. Αν θέλεις, δοκίμασε να δώσεις ως είσοδο 5hello <enter> (ακριβώς έτσι, τον αριθμό κολλητά με το string) και θα δεις ότι το πρόγραμμά σου δουλεύει σωστά.

+1

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

  1. Μην ανεβάζεις κώδικα σε screenshot. Όχι μόνο εδώ, γενικά. Χρησιμοποίησε το κουμπάκι "code sample", και ό,τι αντίστοιχο έχει η κάθε πλατφόρμα. Για να σε βοηθήσει κάποιος χρειάζεται 3'' αν μπορεί να κάνει copy paste τον κώδικά σου, και 5' για να ξαναγράψει τον κώδικα που βλέπει στο screenshot.
  2. Πάντα να στοιχίζεις τον κώδικά σου. Για να διαβάσει κάποιος κώδικα χωρίς στοίχιση χρειάζεται πολλαπλάσιο χρόνο. Ειδικά από τη στιγμή που δεν μπορεί να κάνει copy paste και αυτόματη στοίχιση... :)
  3. Λιγότερο σημαντικό, αλλά αντί να γράψεις "στον πρώτο χαρακτήρα που δινω το πρόγραμμα σταματαει", προτίμησε να κάνεις copy paste ακριβώς ό,τι δείχνει το terminal σου. Ή να δείξεις ένα screenshot από την εκτέλεση. Η φράση "το πρόγραμμα σταματάει" μπορεί να σημαίνει πολλά πράγματα, όπως "τερματίζει", "σκάει", "δεν ανταποκρίνεται".

Όπως καταλαβαίνεις τα παραπάνω συσσωρεύονται, το οποίο σημαίνει ότι αν χρειάζεται κάποιος 10' για να απαντήσει σε μία ερώτηση, έχει πολύ λιγότερες πιθανότητες να το κάνει (ή θα αργήσει πολύ περισσότερο να το κάνει) από ό,τι αν χρειάζεται 30'' για να απαντήσει, οπότε ενδέχεται να αργήσεις κι εσύ να λάβεις την απάντησή σου. Φυσικά σε ένα τόσο μικρό πρόγραμμα δεν κάνει μεγάλη διαφορά, αλλά αν ανεβάσεις screenshot από πρόγραμμα 100 γραμμών που έχει και pointers, μπορώ να εγγυηθώ ότι δεν θα λάβεις απάντηση :)

1 Answer

+1 vote

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

Δεν ξέρω αν έχουν δώσει οι διδάσκοντες οδηγίες για να ενεργοποιείς τα warnings στο Dev-C++, αλλά νομίζω θα ήταν μία καλή ευκαιρία να το ψάξεις, γιατί βρίσκεις ενδιαφέροντα πράγματα (θα παρέθετα οδηγίες εδώ αλλά δεν βρήκα κάτι με πρόχειρο γουγλάρισμα...):

foo.cpp: In function ‘int main()’:
foo.cpp:16:10: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char*’ [-Wformat=]
   printf("%c", &st[i]);
          ^~~~  ~~~~~~
foo.cpp:7:9: warning: unused variable ‘k’ [-Wunused-variable]
  int N, k=0;
         ^

Από εκεί και πέρα, ο κώδικάς σου έχει κάποια λαθάκια, κυρίως σχετικά με το πώς διαχειρίζεσαι την αλλαγή γραμμής. Η scanf διαβάζει και τον χαρακτήρα αλλαγής γραμμής (που ενδέχεται να είναι και 2 χαρακτήρες στα Windows), και εισάγεις έναν τέτοιο χαρακτήρα όταν πατάς το enter μετά τον αριθμό σου [1]. Οπότε για N < 2-3 το πρόγραμμά ενδέχεται να τερματίσει αμέσως, ενώ για μεγαλύτερα N θα σου φάει τους πρώτους 1-2 χαρακτήρες.

by (800 points)

301 questions

289 answers

288 comments

770 users