TL;DR: Δεν είναι καλή ιδέα να χρησιμοποιήσετε το scanf
για να διαβάσετε το input σε αυτή την άσκηση. Θα παιδευτείτε χωρίς λόγο.
Η λειτουργία του scanf
περιγράφεται με μεγάλη λεπτομέρεια εδώ. Αντιγράφω δύο σημεία που είναι ενδιαφέροντα για τη συζήτησή μας:
Conversion specifier %s
: "matches a sequence of non-whitespace characters (a string)."
και μετά:
All conversion specifiers other than [
, c
, and n
consume and discard all leading whitespace characters (determined as if by calling isspace
) before attempting to parse the input.
Δηλαδή, το scanf("%s", s)
ξεκινάει προσπερνώντας τυχόν λευκούς χαρακτήρες στην αρχή του input. Στη συνέχεια, διαβάζει και αποθηκεύει στον πίνακα s
μία συμβολοσειρά, μέχρι να βρει τον πρώτο λευκό χαρακτήρα (μη συμπεριλαμβανομένου).
Για τις ανάγκες της άσκησης που συζητάμε, αυτό δεν είναι αυτό που θέλουμε, για δύο λόγους:
Η εκφώνηση δε λέει ότι οι προς εξέταση συμβολοσειρές δεν περιέχουν λευκούς χαρακτήρες, π.χ. κενά διαστήματα. Για παράδειγμα, η συμβολοσειρά "hello olleh"
(με ένα ή περισσότερα κενά μεταξύ των λέξεων) είναι παλινδρομική. Τα testcases στον grader δεν έχουν τέτοιες συμβολοσειρές, όμως θα μπορούσαν να έχουν!
Στην περίπτωση των κενών γραμμών, δεν υπάρχει τίποτα για να διαβάσει η scanf
σε μια κενή γραμμή, οπότε συνεχίζει να διαβάζει από την επόμενη γραμμή. Αυτός είναι ο λόγος που οι συμβολοσειρές "-0123+ab##ba+3210-"
και "abcdefghijklmnopqrstuvwxyz"
(4η και 5η στο input, αντίστοιχα) φαίνεται να διαβάζονται πριν την ώρα τους από το πρόγραμμα της ερώτησης. (Αναζητήστε το λόγο που η δεύτερη συμβολοσειρά επαναλαμβάνεται δύο φορές! Σκεφτείτε τι κάνει η scanf
όταν τελειώσει το input.)
Άρα τι κάνουμε τώρα;
Ξεχνάμε το (scanf("%s", ...)
για αυτή την άσκηση! Δε βολεύει. Αν θέλετε <cstdio>
, χρησιμοποιήστε το gets
ή καλύτερα το fgets
. Διαφορετικά, είτε χρησιμοποιήστε το <iostream>
και την cin.getline()
, είτε διαβάστε τους χαρακτήρες της γραμμής με τα χεράκια σας, με ένα loop που κάνει getchar()
, και αποθηκεύστε τους έναν-έναν στον πίνακά σας. Το τελευταίο είναι πολύ εύκολο!