C ++中的句子修正

时间:2013-12-29 22:02:33

标签: c++ string char

所以我必须制作一个程序,用句子做这些事情“:

  1. 输入:“这是一个(5个空格)示例”(对于任何标点符号和空格)

    输出:“这是一个例子”,我已经完成了这一部分,但是遇到了另一部分。

  2. 输入:“这是一个(例如5个空格),,,,,,,,,(4个空格)示例”

    我得到:“这是一个例子”,而不是“这是一个例子。

  3. 如果有1个或2个点,请留下一个点,然后将其写成大写字母。 如果有三个或更多的点和一个小写字母后面打印3点然后其余的,如果字母是大写字母留下一个点。为此,我不知道该怎么做。


  4. #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];
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

bool t=!(a[i]==' ' && ispunct(a[i+1]));

这会删除任何以空格开头的标点符号。

bool k=!(ispunct(a[i]) && a[i+1]==' ');

这会删除任何标点符号后跟空格。

因此,如果附近有空格,这两个“规则”会删除所有单个标点符号。结合删除多个标点符号的(正确)规则,您根本不会得到标点符号(案例2)。

对于案例3,您需要更多标志。我要说你需要一个比单循环迭代更长寿的标志。