第一章 引言
练习1-9:编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替
- 很自然的,我们希望首先输入一个字符,然后判断它是否是空格,如果是,那么继续输入下一个字符并且判断其是否为空格。因为考虑可能有多个空格,那么需要一个循环,循环的条件设置为“首先输入为空格”。这样一来,在循环当中输入,每一个空格都用后面的字符覆盖,直到遇到一个非空格的字符,输出并且退出循环。如果开始的字符并非空格,输出即可。从而有以下代码:
/*复制输入,将多个空格转换成一个空格*/
#include<stdio.h>
int main(void)
{
char ch;
while((ch=getchar())!=EOF)
{
if(ch==' ')
{
printf("%c",ch);
while(ch==' ')
ch=getchar();
printf("%c",ch);
}
else
printf("%c",ch);
}
return 0;
}
- 另外一个想法是,设置两个变量,一个负责实时的输入,另一个则负责记录上一个字符。如果输入了空格,那么将上一个字符与空格比较,如果不是,则输出。无论是不是,都需要将这个值赋值给上一个(空格则不影响),且继续开始循环。代码如下:
#include<stdio.h>
int main()
{
int ch,lastc;
lastc='a';
while((ch=getchar())!=EOF)
{
if(ch!=' ')
putchar(ch);
if(ch==' ')
if(lastc!=' ')
putchar(ch);
lastc=ch;
}
return 0;
}
练习1-1x:关于字符输入计数的相关问题
1、统计单词数量
想法:将单词视为连续的字母(只有一个字母并不无影响)。从而可以使用while循环来进行不断地输入。如果遇到了非字母的字符,循环结束,此时计数变量递增即可。这种想法和书上的不一样,但是是可行的。代码如下:
/*统计单词数*/
#include<stdio.h>
int main(void)
{
int ch,num;
while((ch=getchar())!=EOF)
{
if(ch!=' '&&ch!='\n'&&ch!='\t')
{
while((ch=getchar())!=' '&&(ch!='\n')&&ch!='\t')
;
++num;
}
}
printf("%d",num);
return 0;
}
2、以每行一个单词的形式打印输入
事实上这只需要在前面计数程序的基础上做一点点改动即可:在每次while循环前和循环内部打印输入,在循环结束时打印换行符即可。代码如下:
/*以每行一个单词的形式打印输入*/
#include<stdio.h>
int main()
{
int ch;
while((ch=getchar())!=EOF)
{
if(ch!=' '&&ch!='\n'&&ch!='\t')
{
putchar(ch);
while((ch=getchar())!=' '&&(ch!='\n')&&ch!='\t')
putchar(ch);
putchar('\n');
}
}
return 0;
}
3、打印输入中单词长度的直方图
不太理解最终需要达到的效果······那么就按照我的想法去做了!
- 效果1:在每一行打印一个单词,同时在固定的字段宽度之后打印星号,星号数等于单词长度。代码如下:
#include<stdio.h>
#define length 30
int main()
{
int ch,m,n,size;
//m,n用于循环,size为单词长度
m=n=size=0;
while((ch=getchar())!=EOF)
{
if(ch!=' '&&ch!='\n'&&ch!='\t')
{
putchar(ch);
++size;
while((ch=getchar())!=' '&&(ch!='\n')&&ch!='\t')
{
putchar(ch);
++size;
}
//printf("%d",size);//测试输出
for(m=0;m<length-size;m++)
putchar(' ');
putchar(':');
for(n=0;n<size;n++)
putchar('*');
putchar('\n');