Sziasztok,
van egy feladat, mondjuk egy
std::string
típusú változóban kell a szóközöket (incl. tabulátorok...) kipucolni, erre volt egy ilyen kód:
========
std::string removewsp(std::string value) {
int64_t i = 0;
while (i < value.size()) {
if (isspace(value[i])) {
value.erase(i, 1);
} else {
i++;
}
}
return value;
}
========
Aztán kitalálták, hogy az isspace() nem elég, mert pl az ASCII 160-at (NBSP) nem törli, így kegészítették erre:
========
#define NBSP 160
std::string removewsp(std::string value) {
int64_t i = 0;
while (i < value.size()) {
if (isspace(value[i]) || (value[i] == NBSP)) {
value.erase(i, 1);
} else {
i++;
}
}
return value;
}
========
Ez viszont nem jó, mert egyrészt szól a fordító, hogy az ott soha nem lesz igaz, másrészt a fordítónak igaza van. (Úgy tudom az std::string mint típus char szekvencia, a "sima" char pedig signed, így az nem nagyon lesz soha 128-nál nagyobb értékű, de lehet -127 is).
Volt egy javaslatom, hogy akkor csináljuk így:
========
if (isspace(value[i]) || (value[i] == static_cast<char>(NBSP))) {
========
mert szerintem ha egy olyan unsigned char tömbből csinálunk std:string-et, aminek az egyik eleme nagyobb, mint 128, akkor a fordító szépen elvégzi a castolást, így a 160-ból pl -96 lesz.
========
unsigned char c_array = {102, 111, 111, 160, 98, 97, 114}; // "foo\0xA0bar"
std::string c_str(c_array);
value = c_str;
========
Ha ezt megnézem karakterenként, akkor a 3. helyen (0-tól) -96 lesz. Ráadásul a függvény is jól működik, míg cast nélkül a 160-at (értelemszerűen) nem találja meg.
A válasz az ötletre az volt, hogy ez csak a warning-ot szünteti meg, nem megoldás a problémára.
Szeretek tanulni és megérteni dolgokat, és mivel egyéb válasz nem jött, így kérdezem a T. Nagyérdeműt: miért csak a warning-ot szünteti meg a static_cast, és mi lenne a helyes megoldás?
Köszi.