版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/navicheung/article/details/85107941
C语言程序设计(第二版) 练习1-21 个人设计
练习 1-21 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。
代码块:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void entab(char s[]); //定义函数entab
int main()
{
char string[80]; //定义一个足够大的数组
printf("Please enter string: "); //输入一个字符串
gets(string);
entab(string); //调用entab函数
puts(string); //输出变换后的字符串
system("pause");
return 0;
}
/*entab函数*/
void entab(char s[])
{
int i, j, k, len, space_count; //定义变量,len是字符串长度,space_count是空格计数
len=strlen(s); //测出字符串长度
s[len]='\0'; //给字符串加上终止符
for (i=0, space_count=0; s[i]!='\0'; i++){
if (s[i]==' '){ //当判断出数组中出现空格,开始执行以下条件
space_count++; //空格计数自增加
/*以下7行,是当计数过程中一旦满足空格达到4个的情况,替换为\t,
同时将后面字符向前移动,最后使最外面的for循环的变量i的计数位置转为替换的位置。*/
if (space_count==4){
s[i-3]='\\';
s[i-2]='\\t';
for (j=i-1, k=i+1; s[k]!='\0'; s[j++]=s[k++]);
s[j]='\0';
i-=2;
space_count=0;
}
}
else if (space_count>1){ //当判断数组中不是空格,同时空格计数大于1的情况下开始执行以下条件
if (space_count==4){ //以下7行的原理同前一个
s[i-3]='\\';
s[i-2]='\\t';
for (j=i-1, k=i+1; s[k]!='\0'; s[j++]=s[k++]);
s[j]='\0';
i-=2;
space_count=0;
}
else{ //此条件为空格计数不是4的情况下的处理
for (j=i-space_count+1, k=i; s[k]!='\0'; s[j++]=s[k++]);
s[j]='\0';
i-=3;
space_count=0;
}
}
else //当以上条件都不满足,意味着空格为1,不需要移动,空格计数归零
space_count=0;
}
s[i]='\0';
}