首页
社区
课程
招聘
[分享]C语言学习《The C Programming Language》第一章习题同步
发表于: 2014-5-7 17:12 5504

[分享]C语言学习《The C Programming Language》第一章习题同步

2014-5-7 17:12
5504
C语言学习《The C Programming Language》这里的习题答案跟原答案基本上完全不一样,可以做参考 不对的地方,烦请指正

练习1-1
运行"Hello World",有意去掉部分代码,查看错误信息.
/*
C语言基础学习第一个小程序
2014年5月7日17时01分09秒
*/

#include <stdio.h>				//标准输入输出头文件
#include <Windows.h>			//这个暂时还不明白,system("pause");这句不能用试了几次试出Windows.h
int main(void)					//main函数返回值类型为int 参数void类型 暂时还不太明白void
{
	printf("Hello World\n");	//printf输出函数,在头文件stdio.h内,stdio.h内有哪些函数慢慢再发掘

	system("pause");			//这个system是个函数吧在Windows.h头文件里,慢慢再发掘这个头文件中的其它函数
	return 0;					//return返回值 更改返回值没发觉有异常
}


练习1-2
查看\c的作用
/*
C语言学习查看输义 \c 有什么作用
2014年5月7日17时14分34秒
*/

#include <stdio.h>
#include <Windows.h>

int main(void)
{
	printf("Hello World\c\n");		//貌似\c没什么作用 输出结果:Hello Worldc 多出来一个c,\没起作用
									//经百度了解\后面的字符不是有效字符时默认将字符直接输出
	printf("Hello World\a\a\n");	//\a音响发出嘟的声音
	printf("Hello World\b\n");		//\b书上说是回退 但是没发觉出来

	system("pause");
	return 0;
}


练习1-3
修改温度转换程序,打印一个标题
/*
C语言学习 循环语句
2014年5月7日17时34分37秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	float fahr, celsius;			//定义两个单精度变量
	float lower, upper, step;		//定义三个单精度变量
	printf("%8s\t%8s\n", "华氏温度", "摄氏温度");
	lower = 0;
	upper = 300;
	step = 20;						//给变量赋值,为什么单精度的可以没有小数点,这不成整形了吗,以后再了解

	fahr = lower;
	while(fahr <= upper)			//while语句 当条件成立走你,不成立滚蛋
	{
		celsius = (5.0/9.0) * (fahr-32.0);
		printf("%8.0f\t%8.2f\n", fahr, celsius);//%这里有猫腻单单%f是输出单精度数据格式%8f,多了个8,让这个数据至少占8个字符,%.2f,是小数点取两位
		fahr = fahr + step;
	}

	system("pause");
	return 0;
}


练习1-4
摄氏温度转换为华氏温度
/*
C语言学习 循环语句
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	float fahr, celsius;							//fahr为华氏温度,celsius为摄氏温度
	float lower, upper, step;						//lower为最低,upper为最高,step为步长
	
	lower = 0;
	upper = 300;
	step = 20;
	celsius = lower;
	printf("%8s\t%8s\n", "摄氏温度", "华氏温度");
	while(celsius <= upper)
	{
		fahr = 9.0 / 5.0 * celsius + 32.0;
		printf("%8.0f\t%8.2f\n", celsius, fahr);
		celsius = celsius + step;
	}

	system("pause");
	return 0;
}


习题1-5
用for语句逆序打印温度转换表
/*
C语言学习 循环语句
2014年5月7日22时15分19秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	float fahr;
	printf("%8s\t%8s\n", "摄氏温度", "华氏温度");	//for(fahr=300; fahr>=0; fahr = fahr-20)
	for (fahr = 300; fahr >= 0; fahr = fahr - 20) //for (fahr = 300; fahr >= 0; fahr = fahr - 20)哪个显得更规范呢
	{
		printf("%8.0f\t%8.2f\n", fahr, (9.0/5.0 * fahr + 32.0));
	}

	system("dir C:");					// 感谢 看雪flze,让我懂得了system("cmd命令")函数的用法
	system("pause");
	return 0;
}


习题1-6 1-7
EOF的值的问题
/*
C语言学习 字符
2014年5月7日23时05分19秒

*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	int c;			
	//char c;

	//c = getchar();
	//while(c != EOF)
	//{
	//	putchar(c);
	//	c = getchar();
	//}
	while((c = getchar()) != EOF)
		putchar(c);					//这里不知道输入什么才能跳出循环除了强行结束Ctrl+C 回过头来再看	
	printf("%d\n", EOF);			//EOF的值为-1

	system("pause");
	return 0;
}



遇到的第一个难题期待前辈解答 感谢 谷月轩 在7楼解答
/*
C语言学习 字符
2014年5月7日23时26分32秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	int nc;

	/*nc = 0;
	while(getchar() != EOF)
		++nc;*/
	for(nc = 0; getchar() != EOF; ++nc)		//无论如何跳不出循环,期待前辈解惑
		;
	printf("%d\n", nc);

	system("pause");
	return 0;
}



习题1-8
统计空格制表换行符个数程序
/*
C语言学习 字符
2014年5月7日23时39分23秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	int num = 0;
	char c;
	/*
	while((c = getchar()) != EOF)
		if(c==' ' || c=='\t' || c=='\n')
			num++;*/						//while语句
	int i;
	for(i=0; (c=getchar())!=EOF; ++i)			//for语句
		if(c==' ' || c=='\t' || c=='\n')
			num++;
	printf("%d\n", num);

	system("pause");
	return 0;
}


习题1-9
多个空格用一个空格代替程序
/*
C语言学习 字符
2014年5月8日00时00分46秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	char c;
	int num = 0;
	/*while((c=getchar()) != EOF)
		if(c == ' ')
		{
			++num;
			if(num == 1)
				putchar(c);
		}
		else
		{
			putchar(c);
			num = 0;
		}*/
	int i;
	for(i=0; (c=getchar())!=EOF; ++i)
	{
		if(c == ' ')
		{
			num++;
			if(num == 1)
				putchar(c);
		}
		else
		{
			putchar(c);
			num = 0;
		}
	}

	system("pause");
	return 0;
}


/*
C语言学习 习题1-9优化代码
2014年5月8日00时24分02秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	char c, lastc;

	lastc = NULL;
	while((c=getchar()) != EOF)
	{
		if(c!=' ' || ' '!=lastc)  //if(c!=lastc)所有重复输入都当成一个
			putchar(c);
		lastc = c;
	}

	system("pause");
	return 0;
}


习题1-10
将制表符 回退符 反斜杠打印出来
/*
C语言学习 字符
2014年5月8日11时52分12秒
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	int c;

	//printf("Hello World\b\b   \n");//关于\b 感谢看雪 谷月轩 解答
	while((c=getchar()) != EOF)		//关于EOF 感谢看雪 谷月轩 解答 Ctrl+z输入EOF
		if(c == '\t')
			printf("\\t");
		else if(c == '\b')			//\b不知道为什么会检测不到 printf("\\b")不执行 不打印"\b"
			printf("\\b");
		else if(c == '\\')
			printf("\\\\");
		else
			putchar(c);

	system("pause");
	return 0;
}


习题1-11
测试单词数目
/*
C语言学习 字符
2014年5月8日12时42分43秒
*/
#include <stdio.h>
#include <Windows.h>
#define OUT 0		//宏定义一个常量
#define IN 1

int main(void)
{
	int c, nl, nw, nc, state;
	nl = nw = nc = 0;
	state = OUT;

	while((c=getchar()) != EOF)
	{
		++nc;					//nc为字符计数
		if(c == '\n')
			++nl;				//nl为行计数
		if(c==' ' || c=='\t' || c=='\n')	//当字符为空格制表换行符时表明单词结束
			state = OUT;					//多个空格制表换行符的时候else if不执行
		else if(state == OUT)				//当输入有效字符时if不成立else if成立时即state = OUT
		{
			++nw;							//nw为单词计数
			state = IN;						//将state = IN表明单词正在输入
		}
	}
	printf("nc = %d\tnl = %d\tnw = %d\n", nc, nl, nw);
	/*
	不输入字符时 输入一个空格时 输入一个制表符时 输入一个换行符时 组合一下再试 一次输入多个空格制表换行时
	看打印结果的变化
	*/

	system("pause");
	return 0;
}


习题1-12
让单词换行输出
/*
C语言学习 字符
2014年5月8日13时16分01秒
*/
#include <stdio.h>
#include <Windows.h>
#define OUT 0
#define IN 1

int main(void)
{
	int c, state;
	state = IN;

	while((c=getchar()) != EOF)
	{
		if(c==' ' || c=='\t')
			state = OUT;
		else if(state == OUT)
		{
			printf("\n%c", c);
			state = IN;
		}
		else
			putchar(c);
	}

	system("pause");
	return 0;
}


习题1-13
解题:统计输入的内容,单词长度为1、2、3、4、5……的数目,并打印直方图出来
                       
                设计流程:
                                1.循环接收输入字符
                                                1)判断是不是单词结束符号如果是
                                                                        判断有没有超过单词上限如果是
                                                                                        使超出上限的变量+1
                                                                        否则如果单词长度大于0
                                                                                        对应数组下标的变量+1
                                                        否则如果是单词标志为OUT
                                                                        单词标志置为IN
                                                                        单词长度置为1       
                                                        否则
                                                                        单词长度+1                                                       
                                2.找出数目最多单词数目
                                3.循环打印直方图
                                                算出打印个数
                                                                循环打印
                                4.如果有就把超出单词上限的个数打出
感觉这一步跳的好远,真艰难
/*
C语言学习 字符
2014年5月9日00时38分00秒
*/
#include <stdio.h>
#include <Windows.h>

#define OUT 0
#define IN 1
#define	MAXWORD 10		//单词最大长度
#define MAXHIST 20		//直方图最大长度

int main(void)
{
	int c, i, j, nc, beyond, len, maxnum, state;//c获取字符nc单词长度计数,beyong超出最大长度的单词个数,maxnum出现次数最大值
	int nw[MAXWORD];
	nc = beyond = len = 0;
	state = OUT;

	for(i=0; i<MAXWORD; ++i)
		nw[i] = 0;

	while((c=getchar()) != EOF)
	{
		if(c==' ' || c=='\t' || c=='\n')
		{
			state = OUT;
			if(nc >= MAXWORD)
				++beyond;
			else if(nc > 0)
				++nw[nc-1];
		}
		else if(state == OUT)
		{
			state = IN;
			nc = 1;
		}
		else
			++nc;
	}

	maxnum = 0;
	for(i=0; i<MAXWORD; ++i)
	{
		if(nw[i] > maxnum)
			maxnum = nw[i];
	}

	i = 0;
	while(i < MAXWORD)
	{
		len = nw[i]*maxnum/MAXHIST;
		printf("出%4d次的有%4d个: ", i+1, nw[i]);
		for(j=0; j<len; ++j)
		{
			printf("*");		
		}
		printf("\n");
		++i;
	}

	if(beyond > 0)
		printf("beyond = %d\n", beyond);

	system("pause");
	return 0;
}


习题1-14
打印各个字符出现频度直方图
/*
C语言学习 字符
2014年5月9日12时26分39秒
*/
#include <stdio.h>
#include <Windows.h>

#define MAXWORD 128
#define MAXHIST 20
#define OUT 0
#define IN 1

int main(void)
{
	int c, i, j, maxnum, len, state;
	int nw[MAXWORD];
	state = OUT;

	for(i = 0; i < MAXWORD; ++i)
		nw[i] = 0;

	while((c = getchar()) != EOF)
	{
		if(c < MAXWORD)
			++nw[c];
	}

	i = 0;
	maxnum = 0;
	while(i < MAXWORD)
	{
		if(nw[i] > maxnum)
			maxnum = nw[i];
		++i;
	}

	i = 0;
	while(i < MAXWORD)
	{
		len = MAXHIST / maxnum * nw[i];
		printf("%4d出现了%4d次: ", i, nw[i]);
		for(j = 0; j < len; ++j)
		{
			printf("*");
		}
		printf("\n");
		++i;
	}

	system("pause");
	return 0;
}


习题1-15
利用函数重写温度转换
/*
C语言学习 字符
2014年5月9日12时56分58秒
*/
#include <stdio.h>
#include <Windows.h>

#define MAXVALUE 300
#define STEP 20

float convertfahr(float celsius);		//忘记声明了参数可以省略celsius, float convertfahr(float);

int main(void)
{
	int i;
	float celsius, fahr;

	printf("%8s\t%8s\n", "摄氏温度", "华氏温度");

	/*
	for(i = 0; i < MAXVALUE; i = i+STEP)
	{
		celsius = i;
		fahr = convertfahr(celsius);
		printf("%8.0f\t%8.2f\n", celsius, fahr);	
	}*/
	/*
	for(celsius = 0; celsius < MAXVALUE; celsius = celsius+STEP)
		printf("%8.0f\t%8.2f\n", celsius, convertfahr(celsius));*/

	celsius = 0;
	while(celsius < MAXVALUE)
	{
		printf("%8.0f\t%8.2f\n", celsius, convertfahr(celsius));
		celsius = celsius + STEP;
	}

	system("pause");
	return 0;
}

float convertfahr(float celsius)
{
	return (9.0 / 5.0) * celsius +32.0;
}


习题1-16
修改程序让程序可以无限输入行内容,并返回其实际长度
/*
C语言写学 数组
2014年5月9日15时03分56秒
*/
#include <stdio.h>
#include <Windows.h>

#define MAXLINE 10

int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main(void)
{
	int len;				//行的长度
	int max;				//最大长度
	char line[MAXLINE];		//输入行数组
	char longest[MAXLINE];	//保存行数组

	max = 0;
	while((len = getline(line, MAXLINE)) > 0)//当前行长度大于0
	{
		printf("%s = %d\n", line, len);
		if(len > max)
		{
			max = len;
			copy(longest, line);
		}
	}
	if(max > 0)
		printf("%s\n", longest);

	system("pause");
	return 0;
}
//获取一个指定长度的输入行
int getline(char s[], int lim)
{
	int c, i, j;
	
	j = 0;
	for(i = 0; (c=getchar())!= EOF && c!= '\n'; ++i)
	{
		if(j < lim-2)		//用j来限制字符长度,而不管其实际长度i
		{
			s[j] = c;
			++j;
		}
	}

	if(c == '\n')
	{
		s[j] == c;
		++i;				//要求是统计行的长度 所以必须要有换行符
		++j;				//只是为了完成固定长度行的字符数组
	}
	s[j] = '\0';
	return i;				//返回的是其实际长度
}
//将指定行复制给另一个字符数组
void copy(char to[], char from[])
{
	int i;
	
	i = 0;
	while((to[i] = from[i]) != '\0')
		++i;
}


习题1-17
输出大于指定长度 的行
/*
C语言学习 数组
2014年5月9日15时24分13秒
*/
#include <stdio.h>
#include <Windows.h>

#define MAXLINE 10		//行上限
#define MAXLEN 8		//行字符限定值

int getline(char s[], int);

int main(void)
{
	int  len;
	char line[MAXLINE];

	while((len = getline(line, MAXLINE)) > 0)
	{
		if(len > MAXLEN)
			printf("%s\n", line);
	}

	system("pause");
	return 0;
}

int getline(char s[], int lim)
{
	int c, i, j;

	i = j = 0;
	while((c = getchar())!=EOF && c!='\n')
	{
		if(j < lim-2)
		{
			s[j] = c;
			++j;
		}
		++i;
	}

	if(c == '\n')
	{
		s[j] = c;
		++j;
		++i;
	}

	s[j] = '\0';
	return i;
}


习题1-18
将行尾的空格制表符去掉
/*
C语言学习 数组
2014年5月9日15时59分29秒
*/
#include <stdio.h>
#include <Windows.h>

#define MAXLINE 10

int remove(char s[]);
int getline(char s[], int maxline);

int main(void)
{
	int i, len;
	char line[MAXLINE];

	while((len = getline(line, MAXLINE)) > 0)
		if((i = remove(line)) >= 0)				//如果整行全是空格返回值为 -1
			printf("%s%s\n", line, "结束");		//加个结束便于测试

	system("pause");
	return 0;
}

int remove(char s[])
{
	int i = 0;

	while(s[i] != '\n')
		++i;
	--i;
	while(i>=0 && (s[i]==' ' || s[i]=='\t'))
		--i;
	//s[i+1] = '\n';							//测试时把这里注释掉
	s[i+2] = '\0';
	return i;
}

int getline(char s[], int maxline)
{
	int c;
	int i, j;

	i = j = 0;
	while((c = getchar())!=EOF && c!='\n')
	{
		if(j < maxline-2)
		{
			s[j] = c;
			++j;
		}
		++i;
	}

	if(c == '\n')
	{
		s[j] = c;
		++j;
		++i;
	}

	s[j] = '\0';
	return i;
}


习题1-19
将字符串倒序
/*
C语言学习 数组
2014年5月9日17时19分04秒
*/
#include <stdio.h>
#include <Windows.h>

#define MAXLINE 10

int reverse(char s[]);
int getline(char s[], int maxline);

int main(void)
{
	int i, len;
	char line[MAXLINE];

	while((len = getline(line, MAXLINE)) > 0)
	{
		printf("%s", line);
		reverse(line);
		printf("%s\n", line);
	}

	system("pause");
	return 0;
}

int reverse(char s[])
{
	int i, j;
	char a;
	i = j = 0;
	while(s[i]!='\n' && s[i]!='\0')
		++i;
	--i;
	for(j = 0; j < i; ++j)
	{
		a = s[i];
		s[i] = s[j];
		s[j] = a;

		--i;
	}
}
int getline(char s[], int maxline)
{
	int c;
	int i, j;

	i = j = 0;
	while((c = getchar())!=EOF && c!='\n')
	{
		if(j < maxline-2)
		{
			s[j] = c;
			++j;
		}
		++i;
	}

	if(c == '\n')
	{
		s[j] = c;
		++j;
		++i;
	}

	s[j] = '\0';
	return i;
}


习题1-20
用等量的空格代替制表符
/*
C语言学习
2014年5月11日16时17分42秒
*/
#include <stdio.h>
#include <Windows.h>

#define TABNUM 8	//TAB键所代表的空格数目

int main(void)
{
	int nc;			//离下一空格位所需空格数目
	int c;
	
	nc = TABNUM;
	while((c = getchar()) != EOF)
	{
		if(c == '\t')			//如果输入的是制表符
		{
			while(nc > 0)
			{
				putchar(' ');
				--nc;
			}
		}
		else if(c == '\n' || c == '\t')		//如果遇到换行 //[COLOR="Red"]程序有点问题 没有处理遇到制表符该如何处理 处理方法跟换行一样所以加这里[/COLOR]
		{
			putchar(c);
			nc = TABNUM;		//将nc = TABNUM
		}
		else					//如果输入的不是制表符
		{
			putchar(c);			//输出字符
			--nc;				//离下一制表位-1字符
			if(nc == 0)			//当nc = 0 则为下一制表符开始位置
				nc == TABNUM;	//将nc = TABNUM
		}
	}

	system("pause");
	return 0;
}


习题1-21程序设计
多个空格替换成制表加空格组合

将一定数目的空格替换成合适数目的制表符+空格
        宏定义 TABNUM 8
        变量 nc 保存距下一制表位所需空格
        变量 nz 保存空格数目
        遇到空格开始计数
                如果是空格 停止输出开始计数
                不是空格了如果空格数量大于0
                        判断空格是不是大于等于nc
                                如果大于 取(nz - nc) / TABNUM + 1 为制表符数目
                                (nz - nc) % TABNUM 为空格输出数目       
                               
                                如果不大于原数目输出空格
                处理换行符制表符情况
               
                否则输出其它字符
               
如果一个空格或者一个制表符都能到达用制表符 如果出现意外情况时 一个空格到不到指定位置 但一个制表符能到达
/*
C语言学习 字符
2014年5月11日17时40分21秒
*/
#include <stdio.h>
#include <Windows.h>

#define TABNUM 8

int disposespace(int space, int tab, const int n);

int main(void)
{
	int c;
	int nc, nz;

	nc = TABNUM;
	nz = 0;

	while((c = getchar()) != EOF)
	{
		if(c == ' ')
		{
			++nz;
		}
		else if(c == '\t' || c == '\n')			//设计的套路跟实现的套路有差别啊,是设计的少么?
		{
			if(nz > 0)
				disposespace(nz, nc, TABNUM);
			nz = 0;
			putchar(c);
			nc = TABNUM;
		}
		else
		{
			if(nz > 0)
			{
				nc = disposespace(nz, nc, TABNUM);
				nz = 0;
			}
			putchar(c);
			--nc;
			if(nc == 0)
				nc = TABNUM;
		}
	}

	system("pause");
	return 0;
}

/*用了个处理空格的函数,返回离下一制表符位字符数*/
int disposespace(int space, int tab, const int n)
{
	int nt, nb, i;
	i = n;

	if(space >= tab)
	{
		nt = (space - tab) / n + 1;
		while(nt > 0)
		{
			putchar('\t');
			--nt;
		}
		nb = (space - tab) % n;
		while(nb > 0)
		{
			putchar(' ');
			--nb;
			--i;
		}
	}
	else
	{
		while(space > 0)
		{
			putchar(' ');
			--space;
			++i;
		}
	}

	return i;
}

习题1-21时钟原理
/*
C语言学习 习题1-21不用函数
2014年5月11日21时53分43秒

思路:nc变量就像时钟一样 除了制表符 换行符复位以外 其它字符都要走动
如果是空格的时候没到制表位 用nz变量统计空格数目 到了制表位就可以用制表符
直接到达 然后nc复位 nz清0, 如果不是空格符 是其它字符就选判断空格计数器 nz
是不是大于0 如果是就补上空格
*/
#include <stdio.h>
#include <Windows.h>

#define TABNUM 8

int main(void)
{
	int nc, nz;						//nc 为固定制表位计数 nz 为多余空格计数
	int c;

	nc = TABNUM;
	nz = 0;
	while((c = getchar()) != EOF)
	{
		if(c == ' ')				//字符是空格先不输出 碰到制表位就输出制表符
		{
			--nc;
			++nz;
			if(nc == 0)
			{
				putchar('\t');
				nc = TABNUM;
				nz = 0;
			}
		}
		else if(c == '\t' || c == '\n')
		{
			while(nz > 0)
			{
				putchar(' ');
				--nz;
			}
			putchar(c);
			nc = TABNUM;
		}
		else
		{
			while(nz > 0)
			{
				putchar(' ');
				--nz;
			}
			putchar(c);
			--nc;
			if(nc == 0)
				nc = TABNUM;
		}
	}

	system("pause");
	return 0;
}


习题1-22
行太长的时候 要求在指定列换行 同时换行前的字符不能为空格及制表符
/*
C语言学习 字符
2014年5月11日22时40分36秒
nc行字符计数
ns空格计数	nc + 1
nt制表符计数nc + TABNUM
遇到空格或者制表符 计数开始 没到指定列不处理 如果到了 就换行nc先清0 以重新计算
输出指定空格数及制表符
遇到换行 nc清零 如果有空格及制表符 就输出
如果是字符 如果有空格及制表符 先输出(这里nc不能清零) 再输出新字符 如果到了指定列换行
[COLOR="Magenta"]这程序写的 好啰嗦,肯定有更好的思路[/COLOR]
*/
#include <stdio.h>
#include <Windows.h>

#define TABNUM 8	//制表符长度
#define ENDNUM 55	//指定列长度

int main(void)
{
	int nc, ns, nt;			//nc字符计数 ns空格计数 nt制表符计数
	int c;

	nc = ns = nt = 0;
	while((c = getchar()) != EOF)
	{
		if(c == ' ' || c == '\t')
		{
			if(c == ' ')
			{
				++nc;
				++ns;
			}
			else if(c == '\t')
			{
				nc = nc + TABNUM;
				++nt;
			}

			if(nc = ENDNUM)
			{
				putchar('\n');
				nc = 0;
				while(ns > 0)
				{
					putchar(' ');
					--ns;
					++nc;
				}
				while(nt > 0)
				{
					putchar('\t');
					--nt;
					nc = nc + TABNUM;
				}
			}
		}
		else if(c == '\n')
		{
			nc == 0;
			while(ns > 0)
			{
				putchar(' ');
				--ns;
				++nc;
			}
			while(nt > 0)
			{
				putchar('\t');
				--nt;
				nc = nc + TABNUM;
			}
		}
		else
		{
			while(ns > 0)
			{
				putchar(' ');
				--ns;
			}
			while(nt > 0)
			{
				putchar('\t');
				--nt;
			}

			putchar(c);
			++nc;
			if(nc == ENDNUM)
			{
				putchar('\n');
				nc = 0;
			}
		}
	}

	system("pause");
	return 0;
}


习题1-23
删除所有注释
/*
C语言学习
2014年5月12日16时50分24秒

首先 判断遇到反斜杠/
		后面的字符跟的是*则是遇到注释头

		后面跟的双是一个反斜杠是//注释

		否则是代码正常输出
*/
#include <stdio.h>
#include <Windows.h>

int main(void)
{
	int c, d;

	d = NULL;
	while((c = getchar()) != EOF)
	{
		if(c == '/')
		{
			if((d = getchar()) == '*')
			{
				while((c = getchar()) != '*' || (d = getchar()) != '/')
					;
			}
			else if(d == '/')
			{
				while((c = getchar()) != '\n')
					;
			}
			else
			{
				putchar(c);
				putchar(d);
			}
		}
		else
		{
			putchar(c);
		}
	}

	system("pause");
	return 0;
}


习题1-24
查找圆括号 方括号 花括号 不配对错误
/*
C语言学习 
2014年5月12日18时07分40秒

正确处理几种情况 单双引号 注释 转义字符序列还不太懂转义字符
出现单引就skipcount函数 直到匹配到另一个单引
出现双线就skipcount函数 直到匹配到另一个双引
碰到反斜杠skipcount函数 跳过一个字符 免得转义单双引(\' \")出现配不了对
正常情况下通过加减计数  来判断圆括号 方括号 花括号 有没有配对
大中小括号计数 < 0 提示错误 结束不等于0提示错误
*/
#include <stdio.h>
#include <Windows.h>

void skipcount(char c);

int main(void)
{
	int round, square, flower;
	int c;

	round = square = flower = 0;
	while((c = getchar()) != EOF)
	{
		if(c == '\'' || c == '\"' || c == '\\')
		{
			putchar(c);
			skipcount(c);
		}
		else
		{
			putchar(c);
			if(c == '(' || c == '\)')
				if(c == '(')
					++round;
				else
				{
					--round;
					if(round < 0)
						printf("圆括号不配对");
				}
			else if(c == '[' || c == ']')
				if(c == '[')
					++square;
				else
				{
					--square;
					if(square < 0)
						printf("方括号不配对");
				}
			else if(c == '{' || c == '}')
				if(c == '{')
					++flower;
				else
				{
					--flower;			
					if(flower < 0)
						printf("花括号不配对");
				}
		}
	}

	if(round != 0)
		printf("圆括号不配对");
	if(square != 0)
		printf("方括号不配对");
	if(flower != 0)
		printf("花括号不配对");

	system("pause");
	return 0;
}

void skipcount(char c)
{
	if(c == '\'')
		while((c = getchar()) != '\'')
			putchar(c);
	else if(c == '\"')
		while((c = getchar()) != '\"')
			putchar(c);
	else
		c = getchar();
	putchar(c);
}


第一章结束了 贴子太长了 为什么代码不能收缩回去呢 看的时候再展开多好啊

第二章地址
http://bbs.pediy.com/showthread.php?p=1284023#post1284023

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
加油加油,
2014-5-7 17:25
0
雪    币: 102
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
“\b”是将光标往回退一格。即光标到了World 的d这里,仔细看光标是在d下面闪烁的,但是字母没有被覆盖,你换成
printf("Hello World\b \n"); 效果会更明显,空格把d覆盖了。
2014-5-7 17:43
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
非常感谢,谢谢
2014-5-7 18:08
0
雪    币: 244
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
当时看的是 C Primer Plus第五版这本书。
2014-5-7 20:25
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
基础都该差不多
2014-5-7 20:47
0
雪    币: 102
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
for(nc = 0; getchar() != EOF; ++nc)    //该循环不停getchar,需要你输入EOF才会停下来。
键盘上EOF的输入方法是ctrl + z.
上传的附件:
2014-5-8 09:15
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢果然是这样
2014-5-8 11:49
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
自己顶一下吧 嘿嘿
学到习题1-21才真正感受到编程的艺术,不一样的思路达到一样的效果,今天去丈人家吃饭,看到钟表走动后,想到了1-21这个习题的另一个解法.算得上是灵感吧.
2014-5-11 22:37
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主加油
2014-5-11 23:18
0
游客
登录 | 注册 方可回帖
返回
//