头图

[题目描述]
编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格。这里所说的空白包括空格、'\t'、'\n'、'\r'。例如原来的字符串是:
This Content hoho
ok?
file system
uttered words
ok ok
end.
is ok
?
压缩了空白之后就是:
This Content hoho is ok ok? file system uttered words ok ok ? end.
实现该功能的函数接口要求符合下述规范:
char shrink_space(char dest, const char *src, size_t n);

给的字符比较混乱,所以我们可以将其保存在文本(shrink_file.txt)中,然后将处理好的字符放在另一个输出文本(shrink_file_output.txt)中。下面是具体的实现过程:
先看一下目标文本的内容
image.png
代码共分为三个部分:
1、一个函数判断当前字符是否为无效字符!

bool is_space(char c)
{
    if(c==' ' || c=='\t' || c=='\n' || c=='\r')
        return true;
    else
        return false;
}

2、处理混乱字符串的核心函数shrink_space()!

char *shrink_space(char *dest, const char *src, size_t n){
        size_t i=0, j=0;
        while(i<n && src[i]) {
            if(is_space(src[i])) {
                dest[j++] = ' ';
                while(is_space(src[++i]))
                    ;
            }else
                dest[j++] = src[i++];
        }
    for(; i<n; ++i)
        dest[i] = '\0';
    return dest;
}

3、然后是我们的main函数(此处我用的是文本按行输入输出)

int main(){
    fstream in("shrink_file.txt");
    ofstream out("shrink_file_output.txt");
    string line;
    char *des = new char[100];
    if(in){
        while(getline(in,line)){
            shrink_space(des,line.c_str(),sizeof(line));
            //注意shrink_space的参数是const char*类型,使用c_str()强制类型转换
            // 如果要将结果输出在控制台,此处用printf
            //printf(shrink_space(des,line.c_str(),sizeof(line)));
            out << line ;
            if(line!=""){
                out << " ";//控制不同行字母间间隔,出现空行不重复加空格
            }
            
        }
    }else{
        cout << "no such file" << endl;
    }
    delete [] des;
    in.close();
    return 0;
}

执行完毕输出文本为:
image.png

达成我们的目标,并且空格间隔也是符合标准的!


沐小轲
9 声望0 粉丝

C++初学者