|
||||||||||||||||||
Add Forum to Favorites | Send Topic To a Friend | View Forum FAQ | Track this topic Page: 1 2 3 »» |
Last Thread Next Thread ![]() |
| To Upper with STL String ? |
|
![]() Emmanuel77 Member since: 10/7/2003 From: France |
||||
|
|
||||
| Hi, Stupid question here, but is there a builtin way to make a ToUpper function with the STL string ? I haven't a decent STL doc... Thanks for any help, Emmanuel |
||||
|
||||
![]() Fruny Moderator Member since: 11/16/2001 From: Paris, France |
||||
|
|
||||
#include <string> #include <algorithm> #include <cctype> std::transform(str.begin(), str.end(), str.begin(), (int (*)(int))std::toupper); The function cast is required to disambiguate between the toupper function in the <locale> header and the one in the <cctype> header. “Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” — Brian W. Kernighan [edited by - Fruny on May 28, 2004 8:02:13 PM] |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
| It takes a committee to make something so conceptually simple so complicated... |
||||
|
||||
![]() Fruny Moderator Member since: 11/16/2001 From: Paris, France |
||||
|
|
||||
quote: Considering that they had more than just the english alphabet to handle, it's more complicated "conceptually" than you think. “Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” — Brian W. Kernighan [edited by - Fruny on May 28, 2004 8:04:54 PM] |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
| And yet, the implementors of string classes in virtually every other language under the sun managed to offer the functionality to the users in a conceptually simple way. |
||||
|
||||
![]() gmcbay Member since: 3/9/2000 From: Cardiff-by-the-Sea (North San Diego), USA |
||||
|
|
||||
| I have very mixed feelings about this and other aspects of the STL. On one hand, you're right, this is completely non-obvious to someone who hasn't dealt with the STL a lot. One would expect something more like myString.to_upper(); On the other hand, it is incredibly flexible, because you can use the same basic transform mechanism with other functions (tolower), or your own custom functions, and with different data types (not just strings). And that is incredibly cool... the problem is, until you're familiar with the STL it is also incredibly non-obvious and difficult to just 'look up', which wouldn't be the case if it were a more traditional API system. |
||||
|
||||
![]() Fruny Moderator Member since: 11/16/2001 From: Paris, France |
||||
|
|
||||
quote: Which is why I don't recommend C++ as a beginner language. “Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” — Brian W. Kernighan |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
quote: But the one doesn't preclude the other. The interface of the C++ string class is *very* ugly - it looks like the result of someone's "orthogonal design" wet dream, one which completely ignores the basic needs of the common developer. Uppercasing and lowercasing is a *very* common operation, doing custom transforms is not. But does the API take that into consideration? |
||||
|
||||
![]() fallenang3l Member since: 2/22/2002 From: USA |
||||
|
|
||||
quote: And it's still not guaranteed to work because (according to the standard) toupper might be given C linkage, but here you're casting it away so it's illegal. |
||||
|
||||
![]() quorn Member since: 4/30/2004 From: United Kingdom |
||||
|
|
||||
| Uppercase doesn't even exist in some languages. It's best not to put something so specific on a general character string implementation. It belongs in locale and deserves to be conceptually separate. People ask questions and code as if ASCII was the only character encoding and that it should be expected to be the default. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) |
||||
|
||||
![]() VizOne Member since: 10/4/2001 |
||||
|
|
||||
quote: You are certainly right. However, a potential (basic_)string::to_upper() could simply delegate the call to its local, so that would not be the point. What Arild Fines means, is that applying the container-concept to the stl-string is so "amazingly reusable, flexible and compatible" that it completely ignores the users needs. IMHO it moreover is a very non-object-oriented-design. A comparable example in real-life would be drinking milk (the chars) out of glass (the string) using a spoon (transform()), just because a spoon can handle all fluids. No one would (well, maybe someone WOULD) do it. Instead we normally drink the milk directly out of the glass (to_upper). Regards, Andre Loker |
||||
|
||||
![]() Anonymous Poster |
||||
|
||||
quote:Bullshit. It works just fine and is trivial to use in plenty of other languages, such as Java, C# (or rather BCL), VB, Smalltalk... |
||||
|
||||
![]() Puzzler183 Member since: 11/23/2001 |
||||
|
|
||||
quote: Did you read any of the posts? Or better yet, do you speak more than one language? How about a language that dosn't use the English alphabet? I somehow doubt it. Things like this are found throughout C++. Another good example is the digraphs and trigraphs that allow people to program while lacking certain keys on their keyboard. For example <% and %> are valid in place of { and }. |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
quote: Uh, dude, almost every modern language in the world offer a .toUpper method on their string types, dealing transparently with the l10n issues - WITHOUT stuffing all the ugliness of the implementation down the users throat. Yes, l10n is hard, but that's the **LIBRARY IMPLEMENTOR'S** problem, not the user's. The fact that the C++ committee even managed to botch this one up is a serious failure on their part. (And yes, as for me, I do speak more than one language, one that incorporates characters not found in the English language.) |
||||
|
||||
![]() George2 Banned Member since: 12/26/2001 From: Belgium |
||||
|
||||
quote: cctype is a C++ header (not part of the C standard, the C version is ctype.h) hence std::toupper doesn't have C linkage. |
||||
|
||||
![]() Puzzler183 Member since: 11/23/2001 |
||||
|
|
||||
quote: Uh, dude, almost every modern language in the world offer a .toUpper method on their string types, dealing transparently with the l10n issues - WITHOUT stuffing all the ugliness of the implementation down the users throat. Yes, l10n is hard, but that's the **LIBRARY IMPLEMENTOR'S** problem, not the user's. The fact that the C++ committee even managed to botch this one up is a serious failure on their part. (And yes, as for me, I do speak more than one language, one that incorporates characters not found in the English language.) I really don't see what the problem is with the code. Could you point it out to me? And I'm sorry they wrote smart code and languages like basic didn't; no big shock I guess. And what language do you speak? |
||||
|
||||
![]() Anonymous Poster |
||||
|
||||
quote:Swedish is my mother tounge, but I also speak English and have basic knowledge of German and Norwegian. As for programming I consider C++ and C# as mother tounge, and I'm farly confident with Java too. If you've used C# you know that things like uppercasing a string "just works". Simply go to System.String in MSDN docs and you know what to do. If you use C++, possibly with STL, on the other hand it's a pain. Sure, I realize that it's harder to do this, but as Arild Fines writes, it's the library implementor's thing to deal with and make a good abstraction of. The C++ committee has clearly failed to make this easy. In my world a good libary should easy and intuative to use, because the library implementor takes care of the tricky parts. This is how Java and .NET class libraries are designed. I cannot say that about STL. |
||||
|
||||
![]() Puzzler183 Member since: 11/23/2001 |
||||
|
|
||||
| Because that is just so hard... Oh wait, it's not... |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
quote: The problem is that it represents a logical disconnect from the operation it is performing. Uppercasing a string is a conceptually very simple operation, as it is reflected by most sane languages, but instead of presenting it like that to the client programmer, like any sane language/library under the sun does, you are forced to deal with some computer scientist pipe dream of orthogonal design; applying an operation to an iterator range. If I want to uppercase a string, I want to do just that. I don't have time or interest in fawning over the beauty of some incredibly abstract and generic design. quote: Now you're just coming off as an ignorant dilettant. How old are you, and what software have you written that I am likely to have used? quote: Sheesh. |
||||
|
||||
![]() quant Member since: 1/24/2003 From: Calvary, TX, United States |
||||
|
|
||||
The string class is not part of the STL for one thing, and how hard is it to make a function which does this impossible hard operation?
void toupper(std::string& str){
std::transform(str.begin(), str.end(), str.begin(), (int (*)(int))std::toupper);
}
toupper(mystring);
Was that difficult? |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
| The standard library design isn't "smart" - it's navel-gazing. |
||||
|
||||
![]() Arild Fines Member since: 8/20/2001 From: Oslo, Norway |
||||
|
|
||||
quote: In quite a few ways, yes. Which is why it should have been offered in the library in the first place. |
||||
|
||||
![]() quant Member since: 1/24/2003 From: Calvary, TX, United States |
||||
|
|
||||
| Well just be greatful i am here to do all the hard work for you. |
||||
|
||||
![]() Anonymous Poster |
||||
|
||||
quote:I completely agree with Arild. Uppercasing a string is logically totally different from transforming iterators and casting function pointer to disambiguate between various toupper functions. I completely fail to see the beauty in this, it's more what I'd like to call "bad design". People do want to uppercase strings, thus it's a failure that the class library itself doesn't have a function for that. There are reasons why C# and Java have added support for such things - it's obvious, easy and productive to use. quote:People in Norway generally speak "bokmål" or "nynorsk", right Arild? |
||||
|
||||
![]() Anonymous Poster |
||||
|
||||
| Does C# even have a standard library? |
||||
|
||||
|
Page: 1 2 3 »» All times are ET (US) ![]() |
Last Thread Next Thread ![]() |
|