[求助]自己写的一个判断中文标点的程序,出了点问题,请各位朋友进来看看

Exodia 2009-12-04 12:11:32
代码在这下面,编译通过,运行的时候本人测试了下,无法判别中文标点符号,具体是什么原因,请各位高手告知.
我的思路是,把中文标点预先存储在string类型的 punct中,把输入的文本储存在str中,接着根据string类型提供的查找函数find_first_of,查找punct在str中任意字符的第一次出现位置,由此来判断是否有中文标点。


#include<iostream>
#include<string>
using namespace std;
void main()
{
string str;
string::size_type pos;
string punct=",。?、;:’“”!()《》";
cin>>str;

if((pos=str.find_first_of(punct,0))!=string::npos)
cout<<"标点位置为"<<pos<<endl;
else cout<<"无标点符号"<<endl;
}




如果有中文的标点符号确实可以判断是有,但是我这个还有个问题, 对于部分汉字,会误做为是标点,比如输入“啊”这个字,这个程序会把它认为是一个标点。 这个是什么原因?


...全文
169 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2009-12-04
  • 打赏
  • 举报
回复
要不就把string改为wstring~~

具体可以到google上搜搜……

just do it!
太乙 2009-12-04
  • 打赏
  • 举报
回复


这个功能不需要lz写:

英文标点用这个:
int ispunct ( int c );
宽字符的用这个:
iswpunct();

太乙 2009-12-04
  • 打赏
  • 举报
回复
得用宽字符~~
Exodia 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kevin_zqw 的回复:]
简单回答下你的问题,下班没时间了

locale langLocale("");
wcout.imbue(langLocale);
wcin.imbue(langLocale);
这三行设置输入输出使用的locale,这样你才能通过wcout和wcin输出和输入宽字符,我的windows系统默认是gbk2312编码,但是程序输入后或者输出前都是使用wstring,也就是wchar_t宽字符来处理的。

至于用数组来获取输入,并转存到wstring中,是因为wcin默认是空格结束输入的,我这里使用的是getline(),就是获取一行输入。

中英文混合的情况下,使用宽字符也是没有的,你可以试下我上面的代码,输入的时候混合中英文,也是可以正常判断标点的。

最后,周末愉快!

[/Quote]

先谢谢你,我现在碰到的问题是,我需要从一个文本里读出一段文字,按你给的代码,是把这段文字当作宽字符处理,我要如何获取文本里的一行并把这一行存储在宽字符数组里或者一个宽字符串数组中,然后按照你所给的程序进行判断?
雨过白鹭洲 2009-12-04
  • 打赏
  • 举报
回复
简单回答下你的问题,下班没时间了

locale langLocale("");
wcout.imbue(langLocale);
wcin.imbue(langLocale);
这三行设置输入输出使用的locale,这样你才能通过wcout和wcin输出和输入宽字符,我的windows系统默认是gbk2312编码,但是程序输入后或者输出前都是使用wstring,也就是wchar_t宽字符来处理的。

至于用数组来获取输入,并转存到wstring中,是因为wcin默认是空格结束输入的,我这里使用的是getline(),就是获取一行输入。

中英文混合的情况下,使用宽字符也是没有的,你可以试下我上面的代码,输入的时候混合中英文,也是可以正常判断标点的。

最后,周末愉快!
Exodia 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kevin_zqw 的回复:]
#include <iostream>
#include <string>

using namespace std;

int main()
{
locale langLocale("");
wcout.imbue(langLocale);
wcin.imbue(langLocale);

wstring str;
wstring::size_type pos;
wstring punct = L",。?、;:’“”!()《》"; 

wchar_t input[256];
wcin.getline(input, sizeof(input) / sizeof(wchar_t));

str = input;
wcout < < str < < endl;

if((pos = str.find_first_of(punct, 0)) != string::npos)
wcout < < L"标点位置为" < < pos < < endl;
else
wcout < < L"无标点符号" < < endl;
}

[/Quote]

朋友,这个程序确实可以实现,不过能解释下代码意思吗,小弟学C++不长,
locale langLocale("");
wcout.imbue(langLocale);
wcin.imbue(langLocale);
这三行是什么意思,
另外为什么要用一个数组来存储输入字符,然后再赋值给str,我试了下直接用wcin>>str,就无法实现这个功能了,做这个函数的用途我主要是想用在处理一个大型文本上,给这个文本根据标点来断句,所以需要返回一个下标位置,让我确定下一句的起始位置,而文本的话,可能会有中英混合还有数字这种情况存在,如果都用宽字符处理,返回位置是按照宽字节来计算的,这样在判断句子起始位置上可能会不方便。
Exodia 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hqin6 的回复:]
C/C++ code

这个功能不需要lz写:

英文标点用这个:int ispunct (int c );
宽字符的用这个:
iswpunct();
[/Quote]

朋友,我用了下iswpunct函数,好像还有点问题,测试这个函数的代码如下:
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
void main()
{
wchar_t t;
cin>>t;
cout<<iswpunct(t)<<endl;
}

输入中文标点返回值是0.这函数怎么用?
雨过白鹭洲 2009-12-04
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>

using namespace std;

int main()
{
locale langLocale("");
wcout.imbue(langLocale);
wcin.imbue(langLocale);

wstring str;
wstring::size_type pos;
wstring punct = L",。?、;:’“”!()《》";

wchar_t input[256];
wcin.getline(input, sizeof(input) / sizeof(wchar_t));

str = input;
wcout << str << endl;

if((pos = str.find_first_of(punct, 0)) != string::npos)
wcout << L"标点位置为" << pos << endl;
else
wcout << L"无标点符号" << endl;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧