LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: chemist

C++ STL 转换 string 大小写编译出错以及一个 C 中 strcpy 的问题

[复制链接]
发表于 2003-7-27 10:52:05 | 显示全部楼层
例2:
// Accept a string ,print it in upper case and lower case
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
using namespace std;

int my_tolower(char c)
{
    return tolower(static_cast<char>(c));
}

int my_toupper(char c)
{
   return toupper(static_cast<char>(c));
}

int main()
{
    // input a string
    cout << "lease input a string: ";
    string s;
    cin >> s;
    cout << "original: " << s << endl;

    // lowercase all characters
    transform (s.begin(), s.end(),    // source
               s.begin(),             // destination
               my_tolower);              // operation
    cout << "lowered:  " << s << endl;

    // uppercase all characters
    transform (s.begin(), s.end(),    // source
               s.begin(),             // destination
               my_toupper);              // operation
    cout << "uppered:  " << s << endl;
}
发表于 2003-7-27 10:53:50 | 显示全部楼层
例3:
// Accpet a string, lowercase all charaters and uppercase all charaters
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
using namespace std;

int my_tolower(int x)
{
        return (x < 0) ? x : tolower(x);
}

int my_toupper(int x)
{
        return (x < 0) ? x : toupper(x);
}

int main()
{
        // Input a string
        cout << "lease into a string: ";
        string s;
        cin >> s;
        cout << "original: " << s << endl;

        // lowercase all characters
        transform(s.begin(), s.end(), s.begin(),
                my_tolower);
        cout << "lowered: " << s << endl;

        // uppercase all characters
        transform(s.begin(), s.end(), s.begin(),
                my_toupper);
        cout << "uppered: " << s << endl;
}
发表于 2003-7-27 10:56:49 | 显示全部楼层
例4(类似例2):

// Define a  class
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <clocale>
using namespace std;

class my_tolower
{
public:
        char operator()(char c) const
        {
                return tolower(static_cast<const char>(c));
        }
};

class my_toupper
{
public:
        char operator()(char c) const
        {
                return toupper(static_cast<const char>(c));
        }
};

int main()
{
    // input a string
    cout << "lease input a string: ";
    string s;
    cin >> s;
    cout << "original: " << s << endl;

    setlocale(LC_ALL, "");

    // lowercase all characters
    transform (s.begin(), s.end(),    // source
               s.begin(),             // destination
               my_tolower());              // operation
    cout << "lowered:  " << s << endl;

    // uppercase all characters
    transform (s.begin(), s.end(),    // source
               s.begin(),             // destination
               my_toupper());              // operation
    cout << "uppered:  " << s << endl;
}
发表于 2003-7-27 10:59:11 | 显示全部楼层
例5:

// A solution for an ASCII based computer
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

inline char my_tolower(char c)
{
  if (c > 64 && c < 96)
    c += 32;

  return c;
}


int main()
{
    cout << "lease input a string: ";
    string s;
    cin >> s;
    cout << s << endl;

    transform(s.begin(), s.end(), s.begin(), my_tolower);

    cout << s << endl;


    return 0;
}
 楼主| 发表于 2003-7-27 20:49:51 | 显示全部楼层
最初由 quanliking 发表
#include <cctype> 也没问题。

对于顶楼的问题,我刚开始学编程,所以觉得比较有意思,解释如下:
"...
negative value that converts to a negative integer most likely not
equal to EOF, in which case passing it to any of the is... or to...
functions invokes undefined behavior.

网上找了几种方案,高手指点:


我到网上又查找了一下,发现另外一种比较简便的实现方法,举例如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <cctype>

  5. using namespace std;

  6. int main(void)
  7. {
  8.         string s = "This is a TEST string.";
  9.         // original
  10.         cout << "orig: " << s << endl;

  11.         // to lower case
  12.         transform (s.begin(), s.end(), s.begin(), (int(*)(int))tolower);
  13.         cout << "lower: " << s << endl;

  14.         // to upper case
  15.         transform (s.begin(), s.end(), s.begin(), (int(*)(int))toupper);
  16.         cout  << "upper: " << s << endl;

  17.         return 0;
  18. }
复制代码
发表于 2003-7-28 00:11:36 | 显示全部楼层
看着觉得有点眼熟
以前也找过
在FAQ中
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=39957

只是现在这里的FAQ一直没有时间维护 不知哪个愿意维护这里的FAQ
因为现在程序版的论坛也开始出现了有深度的问题
 楼主| 发表于 2003-7-28 08:25:24 | 显示全部楼层
最初由 无双 发表
看着觉得有点眼熟
以前也找过
在FAQ中
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=39957

只是现在这里的FAQ一直没有时间维护 不知哪个愿意维护这里的FAQ
因为现在程序版的论坛也开始出现了有深度的问题


FAQ 中的无法在 gcc 中编译通过,不知道在 VC 或者其他的编译器中有没有能通过的。
发表于 2003-7-28 09:41:54 | 显示全部楼层
chinaunix上的FAQ中也有类似问题。关于string的大小写转换例子也是行不通的。
我也这个讨论加入到FAQ中去吧。
发表于 2003-8-9 02:46:18 | 显示全部楼层
最初由 chemist 发表
我到网上又查找了一下,发现另外一种比较简便的实现方法,举例如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <cctype>

  5. using namespace std;

  6. int main(void)
  7. {
  8.         string s = "This is a TEST string.";
  9.         // original
  10.         cout << "orig: " << s << endl;

  11.         // to lower case
  12.         transform (s.begin(), s.end(), s.begin(), (int(*)(int))tolower);
  13.         cout << "lower: " << s << endl;

  14.         // to upper case
  15.         transform (s.begin(), s.end(), s.begin(), (int(*)(int))toupper);
  16.         cout  << "upper: " << s << endl;

  17.         return 0;
  18. }
复制代码


这里为什么要显示进行类型转化?
本来他们的原型就是int tolower(int) 嘛,这转跟不转不是一样吗?
 楼主| 发表于 2003-8-11 15:21:56 | 显示全部楼层
最初由 pupilzeng 发表
这里为什么要显示进行类型转化?
本来他们的原型就是int tolower(int) 嘛,这转跟不转不是一样吗?


I am not clear about that.  But it DOES work.  I don't know the reason.  Anybody explains it?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表