K&R C Bible EX1-9 练习

习题1-9 编写一个将输入复制到输出的程序,将每一个连续一个或多个空格用一个空格替代。

思路:1.如何判断一个空格,这里涉及的是或者否语句  可以用==或者!=‘  ’(单引号里面为空格)

          2.这里最关键的就是如何判断是一个连续的空格。并且如果字符间只有一个空格的时候是需要按照一个空格的格式输出。这里可以按照状态进行分类,假设用一个数字或者标识保存着前面一个字符的状态即是一个空格或者不是一个空格。那么思路就简单了,如果当前的字符是空格,然后判断前一个字符状态,如果是空格表明这是一个连续的空格,那么这个空格就跳过不显示。如果前一个不是空格那就先输出当前的空格,并且将当前的空格状态赋予前一个字符的状态当做下次判断的依据。如果你听懂了刚才我所叙述的内容,你将会写出如下的程序:

#include <stdio.h>
#define SP 0    //定义空格状态 SP: Space缩写
#define NOTSP 1 //定义非空状态 NOTSP: NOT Space缩写
int
main()
{
	char c;
	char pre_state = SP; //先用pre_state定义前一个字符的状态,并且将空格状态初始化给pre_state
	while((c=getchar())!=EOF) //用是否是End Of File (Linux 下按 Ctrl+D 表示EOF) 跟用户交互,判断字符输入的结束
	{
		if(c==' ')  //首先判断是否是一个空格,如果是一个空格则进入判断语句内部,并且判断是否是连续空格
		{
			if( pre_state == NOTSP) //如果前一个字符不是空格,那么表示这是第一个空格
			{
			putchar(c);//直接输出第一个空格
			pre_state=SP; //将状态变为前一个字符是空格状态
			}
			else 
			;//如果前一个字符是空格,那么程序什么都不做,直接空语句
		}
		else 
		{
		putchar(c);//如果用户输入不是空格那么直接复制用户的输入即可		
		}
	}
	return 0;
}

如果你这样交个编译器,并且输入:     (前面有三个空格)hello     (前面有五个空格)world,将会得到:  (前面一个空格)hello(中间无空格)world    

也就是说句首的连续三个空额用一个空格输出,出现我们预期的效果,但是后面的五个连续空格没有缩并成一个空格。这样需要再非空格输出后将前一个字符状态转变成非空格状态,这样就完满了。

#include <stdio.h>
#define SP 0    //定义空格状态 SP: Space缩写
#define NOTSP 1 //定义非空状态 NOTSP: NOT Space缩写
int
main()
{
	char c;
	char pre_state = SP; //先用pre_state定义前一个字符的状态,并且将空格状态初始化给pre_state
	while((c=getchar())!=EOF) //用是否是End Of File (Linux 下按 Ctrl+D 表示EOF) 跟用户交互,判断字符输入的结束
	{
		if(c==' ')  //首先判断是否是一个空格,如果是一个空格则进入判断语句内部,并且判断是否是连续空格
		{
			if( pre_state == NOTSP) //如果前一个字符不是空格,那么表示这是第一个空格
			{
			putchar(c);//直接输出第一个空格
			pre_state=SP; //将状态变为前一个字符是空格状态
			}
			else 
			;//如果前一个字符是空格,那么程序什么都不做,直接空语句
		}
		else 
		{
		putchar(c);//如果用户输入不是空格那么直接复制用户的输入即可		
		pre_state=NOTSP; //将状态重新回到前一个字符非空状态}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhenyi2000/article/details/80034916