所以我必须制作一个程序,用句子做这些事情“:
输入:“这是一个(5个空格)示例”(对于任何标点符号和空格)
输出:“这是一个例子”,我已经完成了这一部分,但是遇到了另一部分。
输入:“这是一个(例如5个空格),,,,,,,,,(4个空格)示例”
我得到:“这是一个例子”,而不是“这是一个例子。
如果有1个或2个点,请留下一个点,然后将其写成大写字母。 如果有三个或更多的点和一个小写字母后面打印3点然后其余的,如果字母是大写字母留下一个点。为此,我不知道该怎么做。
#include <iostream>
#include <string.h>
using namespace std;
int const l=200;
int main ()
{
char a[l];
cin.getline(a,l);
int d;
d=strlen (a);
int i=0;
for(i=0;i<d;i++)
{
bool p = !(a[i] == ' ' && a[i+1] == ' ');
bool r = !(ispunct(a[i])&& ispunct(a[i+1]));
bool t = !(a[i]==' ' && ispunct(a[i+1]));
bool k = !(ispunct(a[i]) && a[i+1]==' ');
if( p && r && t && k)
{
cout<<a[i];
}
}
}
答案 0 :(得分:0)
bool t=!(a[i]==' ' && ispunct(a[i+1]));
这会删除任何以空格开头的标点符号。
bool k=!(ispunct(a[i]) && a[i+1]==' ');
这会删除任何标点符号后跟空格。
因此,如果附近有空格,这两个“规则”会删除所有单个标点符号。结合删除多个标点符号的(正确)规则,您根本不会得到标点符号(案例2)。
对于案例3,您需要更多标志。我要说你需要一个比单循环迭代更长寿的标志。