C++primer第五版 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分

 这是一个关于字符串处理的简单程序,但是里面有一些细节是值得关注的。先附上程序:

// primer_3_2_3.cpp : Defines the entry point for the application.
// 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()
{
	string str1;  //str1用来接收输入的字符串
	string str2("\0");  //str2用来存储处理后的字符串
	cout << "input a string:" << endl;
	while(getline(cin,str1))   //不断读取字符串
	{
		for(int i=0;i<str1.size();i++)  //遍历字符串的每一个元素
		{
			if(!ispunct(str1[i]))  //如果该元素不为标点符号
				str2+=str1[i];  //将该元素赋给str2
		}
		cout << str2 << endl;  //输出处理后的字符串
		str2="\0";  //将str2清空
		cout << "input a string:" << endl;
		string temp;  //如果不加这行及下一行代码,会导致getline将提示语“input a string”读进来
		getline(cin,temp);
	}
	system("pause");
	return 0;
}

再附上运行效果

1. 为了让程序能不断处理字符串,而不是每次只处理一个字符串就结束工作,我将读字符串的代码写进了while循环的判断条件里面。

2. 我使用了两个string对象,一个用来接收用户输入的原始字符串,一个用来存储按元素依次判断后的字符。其实用一个字符串加移位操作应该也能达到目的,但是我认为这样做会比较复杂。

3. string temp;  getline(cin,temp);  这两行代码可能有点莫名其妙,但如果不加这两行代码,会导致getline将提示语“input a string”读进来,即它的作用就是消耗掉提示语。

4. 在输入了一串字符串后,我们需要敲两次回车才能输出结果,原因就在于getline是按行读取,会将第一个回车读进来,如果没有第二个回车,getline(cin,str)还会等待输入。

这里我们可以简单测试一下

在while循环体最前面加一句 cout << "getline is over!" << endl; 如下

while(cin>>str1)   //不断读取字符串
	{
		cout << "getline is over!" << endl;
		for(int i=0;i<str1.size();i++)  //遍历字符串的每一个元素

然后运行,得到结果

看第一个输入,紧跟循环体的getline is over! 是在敲两个回车后才打印出来,可见之前getline(cin,str1)确实是在等待输入;然后又测试了换行之后继续输入,再次敲回车能打印结果,这也再次印证了getline的读取方式。

当然,如果我们将getline(cin,str1)改为cin>>str1,就不必那么麻烦了,直接输入完成后敲回车即可打印结果,即

	while(cin>>str1)   //不断读取字符串

但是cin读到空格处就结束了,因此如果是读一个单词,可以用cin,但是如果要读一行,还是得用getline。效果如下

另外,其实书上的意思是希望能用范围for语句来实现遍历,但是我用的VC6.0,而范围for是c++11的标准,vc6.0不支持此种用法,还有某些较低的vs版本也不支持此种用法。不过在此可以把范围for语句的用法写出来供大家参考(正确性还待验证哈)。

for(auto &c:str1)
{
	if(!ispunct(c))  //如果该元素不为标点符号
		str2+=c;  //将该元素赋给str2
}

最后,ispunct(c)函数是cctype头文件中的函数,当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)。cctype中还有很多常用的函数,现在列在下面,可按需取用

cctype头文件中的函数

isalnum(c)              当c是字母或数字时为真

isalpha(c)               当c是字母时为真

iscntrl(c)                 当c是控制字符时为真

isdigit(c)                 当c是数字时为真

isgraph(c)               当c不是空格但可以打印时

islower(c)               当c是小写字母时为真

isprint(c)                 当c是可打印字符时为真(即c是空格或c具有可视形式)

ispunct(c)               当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)

isspace(c)              当c是空白时为真(即c是空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)

isupper(c)               当c是大写字母时为真

isxdigit(c)                当c是十六进制数字时为真

tolower(c)               如果c是大写字母,输出对应的小写字母,否则原样输出c

toupper(c)               如果c是小写字母,输出对应的大写字母,否则原样输出c

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《C Primer第五版》是一本经典的C语言教程。该书内容全面并深入浅出,在C语言初学者和进阶者广受欢迎。 首先,该书从基础知识出发,逐步引导读者深入学习C语言。它详细介绍了C语言的语法规则、数据类型、运算符、流控制结构等基本概念,并通过丰富的示例和习题帮助读者巩固所学知识。 其次,该书注重实践与理论相结合。作者通过讲解实际示例和编写实用的程序,帮助读者理解C语言的应用场景和解决实际问题的方法。此外,书还介绍了C标准库函数和常见编程技巧,使读者能够更好地运用C语言进行程序开发。 另外,该书特别强调了代码风格和程序设计的规范。它提供了许多编码规范和最佳实践,帮助读者养成良好的编码习惯。这对于初学者来说非常有价值,可以让他们在编程过程少走弯路并提高代码的可读性和可维护性。 最后,该书还介绍了一些C语言的高级特性和进阶内容。读者可以从了解到指针、结构体、内存管理、文件操作等高级主题。这对于有一定C语言基础的读者来说,是继续深入学习和提升技能的绝佳选择。 总的来说,《C Primer第五版》是一本循序渐进、内容全面的C语言教材。它适合于C语言初学者入门学习,也适用于有一定基础的读者深入学习和提升技能。无论是作为学习教材还是参考书籍,该书都是值得推荐的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值