Πώς θα μπορούσε κανείς να μετατρέψει ένα αλφαριθμητικό σε κεφαλαίο. Τα παραδείγματα που έχω βρει από το googling έχουν να κάνουν μόνο με chars.
#include <algorithm>
#include <string>
std::string str = "Hello World";
std::transform(str.begin(), str.end(),str.begin(), ::toupper);
struct convert {
void operator()(char& c) { c = toupper((unsigned char)c); }
};
// ...
string uc_str;
for_each(uc_str.begin(), uc_str.end(), convert());
Σημείωση: Μερικά προβλήματα με την κορυφαία λύση:
21.5 Βοηθητικά προγράμματα ακολουθίας με μηδενικό τέλος
Τα περιεχόμενα αυτών των επικεφαλίδων πρέπει να είναι τα ίδια με τις επικεφαλίδες της Πρότυπης Βιβλιοθήκης C <ctype.h>, <wctype.h>, <string.h>, <wchar.h>, και <stdlib.h> [...]
Πράγμα που σημαίνει ότι τα μέλη cctype
μπορεί κάλλιστα να είναι μακροεντολές που δεν είναι κατάλληλες για άμεση κατανάλωση σε τυπικούς αλγορίθμους.
Ένα άλλο πρόβλημα με το ίδιο παράδειγμα είναι ότι δεν κάνει cast το όρισμα ή δεν επαληθεύει ότι αυτό είναι μη αρνητικό- αυτό είναι ιδιαίτερα επικίνδυνο για συστήματα όπου το απλό char
είναι υπογεγραμμένο. (Ο λόγος είναι ότι: αν αυτό υλοποιηθεί ως μακροεντολή θα χρησιμοποιήσει πιθανότατα έναν πίνακα αναζήτησης και το όρισμά σας έχει δείκτες σε αυτόν τον πίνακα. Ένας αρνητικός δείκτης θα σας δώσει UB).
Δοκιμάστε τη συνάρτηση toupper()
(#include <ctype.h>
). δέχεται χαρακτήρες ως ορίσματα, οι συμβολοσειρές αποτελούνται από χαρακτήρες, οπότε θα πρέπει να επαναλάβετε κάθε μεμονωμένο χαρακτήρα που όταν συνθέτουν τη συμβολοσειρά.