注册 登录
编程论坛 C++教室

大家帮忙看看,关于String类型的代码。哈哈,版主再请进、

lerncav 发布于 2010-08-16 14:53, 1549 次点击
程序代码:
#include<iostream>
#include<string>
#include<cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using string::size_type;
int main()
{
    string user;
    cout<<"Input a sentence, Spaces into ^"<<endl<<endl;
    cin>>user;
    user[0]=toupper(user[0]);
    for (size_type sign=1;sign!=user.size();++sign)
    {
        if((user[sign] == '.') || (user[sign] == '?') || (user[sign] == '!')|| (user[sign] == ';'))
        {
            user[sign + 1] = toupper(user[sign + 1]);
        }
        if(user[sign]=='^')
        {
            user[sign]=' ';
        }
    }
    cout<<endl<<user<<endl<<endl;
    return 0;
}


[ 本帖最后由 lerncav 于 2010-8-16 20:24 编辑 ]
16 回复
#2
幽园香客2010-08-16 15:06
以下是引用lerncav在2010-8-16 14:53:24的发言:

#include<iostream>
#include<string>
#include<cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using string::size_type;
int main()
{
    string user;
    cin>>user;
    user[0]=toupper(user[0]);//把句子的第一个字母变成大写   
    for (size_type sign=1;sign!=user.size();++sign)
    {
        if(ispunct(sign))//如果遇到标点符号
        {
            switch(sign)
            {
            case '.'&&'!'&&'?'://如果标点符号是"."或"!"或"?",将标点符号后一位的字母变成大写
                             //仔细看看你的条件吧?能否改成:   case '.':
                                                                                 case '!':
                                                                                 case '?':
                size_type signA;
                signA=user[sign+1];
                user[signA]=toupper(user[signA]);
                break;
            default:
                break;
            }
        }
    }
    cout<<user<<endl;
    return 0;
}
比如我输入“the.the.”
运行后结果是“The.the.”
句号后面的字母没变大写啊!
不知道哪错了,请大家指教.!


……
 case '.'&&'!'&&'?'://如果标点符号是"."或"!"或"?",将标点符号后一位的字母变成大写
                            //仔细看看你的条件吧?能否改成:       case '.':
                                                                    case '!':
                                                                   case '?':


[ 本帖最后由 幽园香客 于 2010-8-16 15:08 编辑 ]
#3
lerncav2010-08-16 15:16
回复 2楼 幽园香客
不是这个的问题,我试了试把case '.'||'?'||'!':    改成case '.':也不行。
#4
tantan8212010-08-16 15:21
case只能用一个条件   还有就是ispunct返回的true  不是size_type
#5
lerncav2010-08-16 15:31
回复 4楼 tantan821
程序代码:
    string user;
    cin>>user;
    user[0]=toupper(user[0]);//把句子的第一个字母变成大写
    for (size_type sign=1;sign!=user.size();++sign)
    {
        if(ispunct(sign))//如果遇到标点符号
        {
            size_type signA;
            switch(sign)
            {
            case '.'://如果标点符号是"."或"!"或"?",将标点符号后一位的字母变成大写
                signA=user[sign+1];
                user[signA]=toupper(user[signA]);
                break;
            case '?':
                signA=user[sign+1];
                user[signA]=toupper(user[signA]);
                break;
            case '!':
                signA=user[sign+1];
                user[signA]=toupper(user[signA]);
                break;
            default:
                break;
            }
        }
    }
    cout<<user<<endl;
    return 0;
那那个关于ispunct的应该怎么改呢?指教一下?
#6
mxs8102010-08-16 16:10
不知道下面是不是你期望的代码:(我的理解就是,你要将每个句子的首字母变为大写)
程序代码:
    string user;
    cin>>user;
    user[0]=toupper(user[0]);//把句子的第一个字母变成大写
    for (size_type sign = 1; sign < user.size(); ++sign)
    {
        if ((user[sign] == '.') || (user[sign] == '?') || (user[sign] == '!'))
        {
            user[sign + 1] = toupper(user[sign + 1]);
        }
    }
    cout<<user<<endl;
    return 0;
另外,
    string user;
    cin>>user;
这样的话程序应该是不支持输入句子有空格的吧??

[ 本帖最后由 mxs810 于 2010-8-16 16:11 编辑 ]
#7
tantan8212010-08-16 16:15
斑竹就是不一样  楼上正解
#8
towhee2010-08-16 17:25
case后须是常量表达式。。。不晓得楼主的算不算常量表达式
#9
lerncav2010-08-16 17:31
回复 6楼 mxs810
兄弟,你又帮了我一次!
呵呵。
可是,
那如果我想在String语句输入空格呢?
有什么方法没?
#10
mxs8102010-08-16 18:04
回复 9楼 lerncav
你可以考虑改变一下输入数据的存储格式啊,
哈哈,比如说大数组了之类的,这需要你好好考虑一下啦~~
#11
lerncav2010-08-16 18:32
回复 10楼 mxs810
那还有什么类型是和String一样支持长度可变的字符输出呢?
#12
ciweitou1632010-08-16 22:47
程序代码:
#include<iostream>
#include <cstring>
#include<cctype>
using namespace std;

int main()
{
    char user[100];
    //string user;
    cout<<"Input a sentence, Spaces into ^"<<endl<<endl;
    cin.getline(user,100);
   
    user[0]=toupper(user[0]);
   
    for (int sign=1;sign!=100;sign++)
    {
        if((user[sign] == '.') || (user[sign] == '?') || (user[sign] == '!')|| (user[sign] == ';') || (user[sign]==' '))
        {
            user[sign + 1] = toupper(user[sign + 1]);
        }
        /* if(user[sign]=='^')
        {
            user[sign]=' ';
        }
*/
    }
    cout<<endl<<user<<endl<<endl;
   
    return 0;
}
#13
mxs8102010-08-17 09:02
12楼ciweitou163的思路应该可以符合你的要求啦~~

还有一点,不要总是修改自己的1楼的帖子好不,有问题继续回帖,
不然到最后你都弄不明白你的初始问题是什么了,改到最后都没有问题啦,成水帖啦,谨记!!!!
#14
pangding2010-08-18 01:29
如果你用 char 数组的话,库函数 strpbrk 可能对你想干的事有帮助。
比如你的 char buf[] 里存了一串字符,那么:
char *p = strpbrk(buf, ".?!;")
就会把 buf 里第一次出现 . ? ! ; 的那个字符的位置用指针返回来。
你再 p = strpbrk(p, ".?!;"); 就可以继续分析剩下的。返回 NULL 表示字符串里没有 . ? ! ; 中的任何一个了。

如果你想用 String 那么通用通用算法 find_first_of (在头文件 algorithm 里)可以做类似的工作。

我说的这两种写法的好处是,将来如果你想扩展所谓句子的定义,比如你希望 "" 引号里的东西也算句子呀,或者行首的也算句子呀。或者你忽然认为 ; 不应该是句子分隔的标志(英文习惯上 ; 是不分隔句子的,; 号后面的单词不首大写。这个习惯和中文有点不一样,可能有的人并不知道,我调侃一下)的话,只用改很少的代码就可以做到。而且代码的可维护性和可读性可以提高。

当然楼上所有同志给的处理方法依然是一些值得采纳的方法。
#15
pangding2010-08-18 01:31
我那两个函数介绍得不是很详尽,有关它们的用法如果不是很明白的,自己网上查一下就可以了。
#16
mxs8102010-08-18 08:50
以下是引用pangding在2010-8-18 01:29:37的发言:

如果你用 char 数组的话,库函数 strpbrk 可能对你想干的事有帮助。
比如你的 char buf[] 里存了一串字符,那么:
char *p = strpbrk(buf, ".?!;")
就会把 buf 里第一次出现 . ? ! ; 的那个字符的位置用指针返回来。
你再 p = strpbrk(p, ".?!;"); 就可以继续分析剩下的。返回 NULL 表示字符串里没有 . ? ! ; 中的任何一个了。

如果你想用 String 那么通用通用算法 find_first_of (在头文件 algorithm 里)可以做类似的工作。

我说的这两种写法的好处是,将来如果你想扩展所谓句子的定义,比如你希望 "" 引号里的东西也算句子呀,或者行首的也算句子呀。或者你忽然认为 ; 不应该是句子分隔的标志(英文习惯上 ; 是不分隔句子的,; 号后面的单词不首大写。这个习惯和中文有点不一样,可能有的人并不知道,我调侃一下)的话,只用改很少的代码就可以做到。而且代码的可维护性和可读性可以提高。

当然楼上所有同志给的处理方法依然是一些值得采纳的方法。
查了一下 strpbrk这个函数的帮助
  #include <string.h>
  char* strpbrk( const char* str1, const char* str2 );

处理上面的问题的确是得心应手啊,哈哈,学习了~~~
#17
ToBeOOP2010-08-18 23:31
下次发帖最好直接说明是什么问题...
1