C补充1—1章1.0—C程序语言设计(许宝文,李志)

二手书到了,好消息,前主人看的很认真,坏消息,只看到这页了
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后几题好难啊啊啊啊啊,再议

目录

1.1 入门

1.2 变量与算数表达式

练习1-3  //打印温度对照表

练习1-4  //摄氏-华氏温度对照表【只输出了0-120,负数没有输出】

1.3 FOR语句

练习1-5  //温度对照表-逆序

1.4 符号常量

1.5 字符输入/输出

1.5.1 文件复制

练习1-6  //(c=getchar())!=EOF)等于0 OR 1

练习1-7 //打印EOF数值

 参考答案:

1.5.2 字符计数

1.5.3行计数 

练习1-8  //统计各种字符

练习1-9  //输入复制到输出,一个空格代替连续多个

练习1-10  //制表回退符替换输出

BUG:\B无法输入(读入不行--【用 下面的_getch()替换getchar(),因为 getchar() 函数输入流先处理了。】--这个东西也奇奇怪怪的反正,暂时搞不懂,

 1.5.4 单词计数

练习1-11 如何测试单词计数程序,如果存在错误,什么样的输入最有可能发现错误

参考答案: 

练习1-12 每行一个单词打印其输入

1.6 数组

练习1-13 打印单词长度直方图【水平竖直】

0.1 横向-只统计单词,THAT'S属于五个长度的一个单词

 0.2 竖向——使用数组,有限制

练习1-14 打印字符出现频度直方图

1.7 函数

练习1-15,函数实现温度转换计算

1.8 参数——传值调用

1.9 字符数组

练习1-16 修改MAIN,使之可以打印任意长度输入行的长度,并尽可能多打印文本

错误--GPT版本:

参考答案:

练习1-17 打印长度大于80字符所有行

练习1-18 删除每个输入行末尾的的空格及制表符,删除完全是空格的行

练习1-19 函数reserve(s),颠倒字符串s的字符顺序,写程序每次颠倒一个输入行中的字符顺序

1.10 外部变量与作用域

1.1 入门

源程序.C,可执行文件A,OUT,
结构:标准库【头文件】,函数,语句,返回值
转义字符:\b   \n   \\    \" 

#include <stdio.h>
int main(int argc, char *argv[]) {
	printf("\t \\ \"hello,,\bworld\" \\ \n");
	return 0;
}

1.2 变量与算数表达式

声明;变量:整型 INT-16,-32768~+32767    浮点型 FLOAT- 32   字符char【一个字节】  短整型short   长整型long    双精度浮点型double
WHILE循环语句
整型算数运算,舍位,浮点算数运算
打印格式:%6d六个字符宽  %.2d两位小数  %6.2d【&】  %o八进制  %x十六进制  %c字符  %s字符串  %%【%】

练习1-3  //打印温度对照表
#include <stdio.h>
int main(int argc, char *argv[]) {
	int fahr;
	double celsius;
	int lower,upper,step;
	lower=0;
	upper=300;
	step=20;
	fahr=lower;
	printf("华氏温度-摄氏温度对照表\n\n");
	while(fahr<=upper){
		celsius=5.0*(fahr-32)/9.0;
		printf("%6d\t%6.2f\n",fahr,celsius);
		fahr+=step;
	} 
	return 0;
}
练习1-4  //摄氏-华氏温度对照表【只输出了0-120,负数没有输出】
#include <stdio.h>
int main(int argc, char *argv[]) {
	//0,20……300打印温度对照表
	double fahr;
	int celsius;
	int lower,upper,step;
	lower=-20;
	upper=120;
	step=5;
	fahr=lower;
	printf("摄氏温度-华氏温度对照表\n\n");
	while(celsius<=upper){
		fahr=(9.0*celsius/5.0)+32;
		printf("%6d\t%6.0f\n",celsius,fahr);
		celsius+=step;
	} 
	return 0;
}

1.3 FOR语句

允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式

练习1-5  //温度对照表-逆序
#include <stdio.h>
int main(int argc, char *argv[]) {
	int fahr;
	double celsius;
	int lower,upper,step;
	lower=0;
	upper=300;
	step=20;
	printf("华氏温度-摄氏温度对照表\n\n");
	for(fahr=upper;fahr>=lower;fahr-=step)
	{
		celsius=5.0*(fahr-32)/9.0;
		printf("%6d\t%6.2f\n",fahr,celsius);
	}
	return 0;
}

1.4 符号常量

#include <stdio.h>//温度对照表
#define LOWER 0
#define STEP 20
#define UPPER 300 
int main(int argc, char *argv[]) {
	int fahr;
	double celsius;
	printf("华氏温度-摄氏温度对照表\n\n");
	for(fahr=UPPER;fahr>=LOWER;fahr-=STEP)
	{
		celsius=5.0*(fahr-32)/9.0;
		printf("%6d\t%6.2f\n",fahr,celsius);
	}
	return 0;
}

1.5 字符输入/输出

文本流,行末是一个换行符

#include <stdio.h>//一次读写一个字符 
int main(int argc, char *argv[]) {
	int c;
	c=getchar(); 
	putchar(c);
	return 0;
}
1.5.1 文件复制

EOF=end of file 
【\N和EOF】没有关系,见20240321,行编辑,SHELL只有在换行符之后,才会把暂存的东西输给用户,但是循环还在继续】

#include <stdio.h>//一次读写一串
int main(int argc, char *argv[]) {
	int c;
	c=getchar(); 
	while(c!=EOF) {
		putchar(c);
		c=getchar();
	}
	return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
	int c;
	while((c=getchar())!=EOF) {
		putchar(c);
	}
	return 0;
}
练习1-6  //(c=getchar())!=EOF)等于0 OR 1
#include <stdio.h>
int main(int argc, char *argv[]) {
	int c;
	while(((c=getchar())!=EOF)==1) {
		putchar(c);
	}
	return 0;
}
练习1-7 //打印EOF数值

【空格直接结束,ctrl^z输出-1】

#include <stdio.h>
int main(int argc, char *argv[]) {
	int c;
	while((c=getchar())==EOF) {
		printf("%d\n",c);
	}
	return 0;
}
 参考答案:
#include <stdio.h>
int main() {
	printf("EOF is %d\n",EOF); 
	return 0;
}
1.5.2 字符计数

long-->%ld,float,double-->%.0f
空语句

要先ENTER,再^Z,才能输出,空格算一个字符
^Z之后的字符都不计数,但是空格计数,^Z也不计数;紧挨着^Z的最后一个\N不算

4月10回来补充,男神的SHELL,行编辑说清楚了

#include <stdio.h>//字符计数1
int main(int argc, char *argv[]) {
	long nc=0;
	while(getchar()!=EOF)
		nc++;
	printf("%ld\n",nc);
	return 0;
}
#include <stdio.h>//字符计数2
int main(int argc, char *argv[]) {
	double nc=0;
	for(nc=0;getchar()!=EOF;nc++)
		;
	printf("%.0f\n",nc);
	return 0;
}
1.5.3行计数 

==,字符常量‘A’==56,ASCII字符表,‘\N’==10 

#include <stdio.h>
int main(int argc, char *argv[]) {
	int nl=0;
	int c;
	while((c=getchar())!=EOF){
		if(c=='\n')
			nl++;
	}
	printf("换行符=%d\n",nl);
	return 0;
}
练习1-8  //统计各种字符

【不能在括号里面再直接用getchar()=='\n',每次执行GETCHAR都是要输入的】

#include <stdio.h>
int main(int argc, char *argv[]) {
	int nl=0;
	int nt=0;
	int nk=0;
	int c;
	while((c=getchar())!=EOF){
		if(c=='\n')
			nl++;
		else if(c=='\t')
			nt++;
		else if(c==' ')
			nk++;
	}
	printf("空格=%d,制表符=%d,换行符=%d\n",nk,nt,nl);
	return 0;
}
练习1-9  //输入复制到输出,一个空格代替连续多个

输入连续的几个空格,只输出一个,因为不知道会有几个,所以是第一个

#include <stdio.h>
int main(int argc, char *argv[]) {
	int a;
	int cnt=0;
	while((a=getchar())!=EOF){
		if(a!=' '){
			putchar(a);
			cnt=0;
		}
		else{
			cnt++;
			if(cnt==1)
				putchar(a);
			else
				cnt++;
		}
	}
	return 0;
}
练习1-10  //制表回退符替换输出

转义字符是就是输出的时候识别的,难顶,所以要输出文本“\T,\B,\\" 

#include <stdio.h>//错误
int main(int argc, char *argv[]) {
	int a;
	char b='\b';
	char t='\t';
	char c='\\';
	while((a=getchar())!=EOF){
		if(a==t)
			putchar('\t');
		else if(a==b)
			putchar(b);
		else if(a==c)
			putchar(c);
		else
			putchar(a);
	}
	return 0;
}
BUG:\B无法输入(读入
不行--【用 <conio.h> 下面的_getch()替换getchar(),因为 getchar() 函数输入流先处理了。】--这个东西也奇奇怪怪的反正,暂时搞不懂,
#include <stdio.h>
int main(int argc, char *argv[]) {
	int a;
	while((a=getchar())!=EOF){
		if(a=='\t')
			printf("\\t"); 
		if(a=='\b')
			printf("\\b");
		if(a=='\\')
			printf("\\\\");//输出\ 输出B
		else
			putchar(a);
	}
	return 0;
}
 1.5.4 单词计数

&&,||
除第一个单词外,每一个单词一定跟在制表符,换行符,空格的后面,用单词的首字母来计数 

#include <stdio.h>
#define IN 0
#define OUT 1
int main(int argc, char *argv[]) {
	int a;
	int nl,nw,n;
	nl=nw=n=0;
	int state;
	state=OUT;                        
	while((a=getchar())!=EOF){
		n++;                         
		if(a=='\n'){
			nl++;
		} 
		if(a=='\t'||a=='\n'||a==' '){
			state=OUT;                
		}else if(state==OUT){
			state=IN;                  
			nw++; 
		}
	}
	printf("行数=%d,单词数=%d,字符数=%d\n",nl,nw,n); 
	return 0;
}
练习1-11 如何测试单词计数程序,如果存在错误,什么样的输入最有可能发现错误

错误:字符的输入计入单词中

#include <stdio.h>//统计单词 
#define OUT 0
#define IN 1
int main(int argc, char *argv[]) {
	int c;
	int cnt=0;int cnum=0;
	int taste=OUT;
	while((c=getchar())!=EOF){
		if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c=='\''){
			taste=IN;
			cnt++;
			if(cnt==1)
				cnum++;
		}else{
			taste=OUT;
			cnt=0;
		}
	}
	printf("单词数%d\n",cnum);
	return 0;
}
参考答案: 

满足边界条件的输入——包括:
——没有输入(0行,0字符,0单词)
——没有单词(只有换行符)
——没有单词(只有空格,制表,换行符)
——每个单词各占一行(没有空格,制表)
——单词出现在文本行行首
——单词出现于一串空格之后

练习1-12 每行一个单词打印其输入
#include <stdio.h>
int main(int argc, char *argv[]) {
	int a;
	int cnt=0;                        
	while((a=getchar())!=EOF){
		if(a=='\t'||a=='\n'||a==' '){
			if(cnt==0)
				printf("\n"); 
			cnt++;              
		}else {
			putchar(a);  
			cnt=0;                
		}
	}
	return 0;
}

1.6 数组

else if语句,c-'0' 

#include <stdio.h>//统计数字,空白符[空格,制表,换行],及其他字符出现的次数 
int main()
{
	int c,i,nwhite,nother;
	int ndigit[10];
	nwhite=nother=0;
	for(i=0;i<10;i++){
		ndigit[i]=0;
	} 
	while((c=getchar())!=EOF){
		if(c==' '||c=='\t'||c=='\n'){
			nwhite++;
		}else if(c>='0'&&c<='9'){
			ndigit[c-'0']++;
		}else{
			nother++;
		}
	}
	printf("空白符-%d 其他字符%d\n",nwhite,nother);
	for(i=1;i<10;i++){
		printf("数字%d-%d\n",i,ndigit[i]);
	}
	return 0;
}
练习1-13 打印单词长度直方图【水平竖直】
0.1 横向-只统计单词,THAT'S属于五个长度的一个单词
#include <stdio.h>//打印单词长度直方图【水平竖直】
int main()
{
	int cnt=0;
	int i=1;
	int c;
	while((c=getchar())!=EOF){
		if(c>='a'&&c<='z'||c>='A'&&c<='Z'){
			if(cnt==0){
				printf("单词");
			}
			cnt++;
		}else if(c=='\''){
			cnt=cnt;
		}else if((c<'a'||c>'z')&&(c>'A'||c<'Z')&&c!='\''&&cnt!=0){
			printf("%d\t",i);
			i++;
			while(cnt>0){
				printf("口");
				cnt--;
			}
			printf("\n");
		}
	}
	return 0;
}
 0.2 竖向——使用数组,有限制

测试输入 :d dfd df gwge ffdsf sdwesf dwweeef ddskjeda sqwqhjiss weweqwqqaa

#include <stdio.h>//打印单词长度直方图【水平竖直】
int main()
{
	int cnt = 0;
	int c;
	int nword[10] = { 0 };
	while ((c = getchar()) != EOF && cnt < 10) {
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {
			nword[cnt]++;
		}
		else if (c == '\'') {
			nword[cnt] = nword[cnt];
		}
		else if ((c < 'a' || c>'z') && (c > 'A' || c < 'Z') && c != '\'' && nword[cnt] != 0) {
			cnt++;
		}
	}
	int max=0;
	for (int i = 0; i < 10; i++) {
		max = max > nword[i] ? max : nword[i];
	}
	/*printf("%d\n", max);
	for (int i = 0; i < 10; i++) {
		printf("%d", nword[i]);
	}*/
	printf("\n");
	for (int i = 0; i < max; i++) {
		for (int y = 0; y < 10; y++) {
			if (max  - nword[y] > 0) {
				printf(" \t");
			}
			else {
				printf("口\t");
			}
			nword[y]++;
		}
		printf("\n");
	}
	for (int i = 0; i < 10; i++) {
		printf("单词%d   ", i);
	}
	printf("\n");
	return 0;
}
练习1-14 打印字符出现频度直方图
#include <stdio.h>//各个字符出现频度
int main()
{
	int c;
	int nword[24] = { 0 };
	while ((c = getchar()) != EOF ) {
		if (c >= 'a' && c <= 'z' ) {
			nword[c-'a']++;
		}
	}
	for (int i = 0; i < 24; i++) {
		printf("%c出现频度\t",i+'a');
		while (nword[i] != 0) {
			printf("口");
			nword[i]--;
		}
		printf("\n");
	}
	return 0;
}

1.7 函数

power(m,n)计算整数M的N次幂;函数声明,定义

#include <stdio.h>
#include <stdlib.h>
int power(int m, int n);
int main() {
	for (int i = 0; i < 10; i++) {
		printf("%d,\t%d,\tx%d\n", i, power(2, i), power(-3, i));
	}
	return 0;
}
int power(int m, int n) {
	int i, p;
	p = 1;
	for (i= 0; i < n; i++) {
		p *= m;
	}
	return p;
}
练习1-15,函数实现温度转换计算
#include <stdio.h>
#include <stdlib.h>
void cs(int lower, int upper, int step) {
	int fahr = lower;
	double celsius;
	while (fahr <= upper) {
		celsius = 5.0 * (fahr - 32) / 9.0;
		printf("%6d\t%6.2f\n", fahr, celsius);
		fahr += step;
	}
}
int main(int argc, char* argv[]) {
	int lower, upper, step;
	lower = 0;
	upper = 300;
	step = 20;
	printf("华氏温度-摄氏温度对照表\n\n");
	cs(lower, upper, step);
	return 0;d
}
1.8 参数——传值调用

POWER函数2.0——少一个变量

#include <stdio.h>
#include <stdlib.h>
int power(int m, int n);
int main() {
	for (int i = 0; i < 10; i++) {
		printf("%d,\t%d,\tx%d\n", i, power(2, i), power(-3, i));
	}
	return 0;
}
int power(int m, int n) {
	int p;
	for (p= 1; n >0; n--) {
		p *= m;
	}
	return p;
}

1.9 字符数组

'\0'(空字符)插入数组末尾,标记字符串数组的结束——“h e l l o \n \0"

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/*记录输入中最长的一行,并输出*/
int main() {
	int len, max;//当前长度,最长行长度
	char line[MAXLINE];//当前输入行
	char longest[MAXLINE];//用以保存最长行
	max = 0;
	while ((len = getline(line, MAXLINE)) > 0) {
		if (len > max) {
			max = len;
			copy(longest, line);//已知行数,不需要检查溢出
		}
	}
	if (max > 0) {
		printf("%s", longest);
	}
	return 0;
}
//将一行读入数组,并返回其长度
int getline(char line[], int maxline) {
	int  i;
	char c;
	for (i = 0; i < maxline - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
		line[i] = c;
	}
	if (c == '\n') {   //插入\n
		line[i] = c;
		++i;
	}
	line[i] = '\0';   //插入\0
	return i;
}
//form复制到to,假设TO足够大
void copy(char to[], char from[]) {
	int i = 0;
	while ((to[i] = from[i]) != '\0') {
		++i;
	}
}
练习1-16 修改MAIN,使之可以打印任意长度输入行的长度,并尽可能多打印文本
错误--GPT版本:

getline函数在I=999时会退出函数,大循环还在继续,该方式是每一行都输出,字符串长度超过数组上限会输出999,退出-重新进入循环,//单行处理

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/*记录输入中所有行的长度,并输出*/
int main() {
	int len;//当前长度
	char line[MAXLINE];//当前输入行
	while ((len = getline(line, MAXLINE)) > 0) {
		printf("Length of the line: %d\n", len);
		printf("Content of the line: %s", line);
	}
	return 0;
}
//将一行读入数组,并返回其长度
int getline(char line[], int maxline) {
	int  i;
	char c;
	for (i = 0; i < maxline - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
		line[i] = c;
	}
	if (c == '\n') {   //插入\n
		line[i] = c;
		++i;
	}
	line[i] = '\0';   //插入\0
	return i;
}
参考答案:

可以打印任意长度输入行的长度—— i记录字符串的长度,持续记录;J记录被复制到字符串LINE中的的字符的个数,超过996停止
并尽可能多打印文本——最大打印数组容量,原来是这个意思……
输入^Z之后,会输出,最长行的前998个字符

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main() {
	int len, max;
	char line[MAXLINE];
	char longest[MAXLINE];
	max = 0;
	while ((len = getline(line, MAXLINE)) > 0) {
		printf("%d ,%s",len, line);//修改,打印输入行的长度和尽可能打印数组LINE里的字符 
		if (len > max) {
			max = len;
			copy(longest, line);
		}
	}
	if (max > 0) {
		printf("%s", longest);
	}
	return 0;
}
//将一行读入数组,并返回其长度
int getline(char line[], int maxline) {
	int  i, c, j;
	j = 0;
	for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {    //不再检查字符是否超出数组限制,该限制不是循环终止条件
		if (i < maxline - 2) {   //数组最后一个下标MAXLINE-1,读取了输入字符MAXLINE-2,i最大是MAXLINE-3,加上\N,\0 
			line[j] = c;
			++j;
		}
	}
	if (c == '\n') {
		line[j] = c;   //插入\n
		++j;
		++i;
	}
	line[j] = '\0';   //插入\0 ,J有\0,I没有 
	return i;    //i记录字符串的长度,J记录被复制到字符串LINE中的的字符的个数 
}
//form复制到to,假设TO足够大
void copy(char to[], char from[]) {
	int i = 0;
	while ((to[i] = from[i]) != '\0') {
			++i;
	}
}
练习1-17 打印长度大于80字符所有行
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main() {
	int len, max;
	char line[MAXLINE];
	char longest[MAXLINE];
	max = 0;
	while ((len = getline(line, MAXLINE)) > 0) {
		if (len >=80) {
			printf("%d ,%s", len, line);
		}
	}
	return 0;
}
//将一行读入数组,并返回其长度
int getline(char line[], int maxline) {
	int  i, c, j;
	j = 0;
	for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {    //不再检查字符是否超出数组限制,该限制不是循环终止条件
		if (i < maxline - 2) {   //数组最后一个下标MAXLINE-1,读取了输入字符MAXLINE-2,i最大是MAXLINE-3,加上\N,\0 
			line[j] = c;
			++j;
		}
	}
	if (c == '\n') {
		line[j] = c;   //插入\n
		++j;
		++i;
	}
	line[j] = '\0';   //插入\0 ,J有\0,I没有 
	return i;    //i记录字符串的长度,J记录被复制到字符串LINE中的的字符的个数 
}
练习1-18 删除每个输入行末尾的的空格及制表符,删除完全是空格的行

无语,答案都看了好几遍才看懂

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
int remove(char s[]);

int main() {
	char line[MAXLINE];
	while ( getline(line, MAXLINE)> 0) {
		if (remove(line) > 0) {
			printf("%s", line);
		}
	}
	return 0;
}
//将一行读入数组,并返回其长度
int getline(char line[], int maxline) {
	int  i, c, j;
	j = 0;
	for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {    //不再检查字符是否超出数组限制,该限制不是循环终止条件
		if (i < maxline - 2) {   //数组最后一个下标MAXLINE-1,读取了输入字符MAXLINE-2,i最大是MAXLINE-3,加上\N,\0 
			line[j] = c;
			++j;
		}
	}
	if (c == '\n') {
		line[j] = c;   //插入\n
		++j;
		++i;
	}
	line[j] = '\0';   //插入\0 ,J有\0,I没有 
	return i;    //i记录字符串的长度,J记录被复制到字符串LINE中的的字符的个数 
}
int remove(char s[]) {
	int i = 0;
	while (s[i] != '\n')   //找到换行符,i累加
		++i;
	--i;  //倒退一个位置
	while (i >= 0 && (s[i] == ' ' || s[i] == '\t'))   //从后向前检查空格或制表符
		//直到找到一个不是空格或者没有字符可以让她继续倒退(i<0)为止
		--i;
	if (i >= 0) {  //说明至少还有一个字符
		++i;
		s[i] = '\n';  //将换行符和字符串结束符写回输入行
		++i;
		s[i] = '\0';
	}
	return i;
}
练习1-19 函数reserve(s),颠倒字符串s的字符顺序,写程序每次颠倒一个输入行中的字符顺序
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void re(char s[]);
/* 函数reserve(s),颠倒字符串s的字符顺序,写程序每次颠倒一个输入行中的字符顺序*/

int main() {
	char line[MAXLINE];
	while ( getline(line, MAXLINE)> 0) {
		re(line);
		printf("%s", line);
	}
	return 0;
}

int getline(char line[], int maxline) {
	int  i, c, j;
	j = 0;
	for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {    //不再检查字符是否超出数组限制,该限制不是循环终止条件
		if (i < maxline - 2) {   //数组最后一个下标MAXLINE-1,读取了输入字符MAXLINE-2,i最大是MAXLINE-3,加上\N,\0 
			line[j] = c;
			++j;
		}
	}
	if (c == '\n') {
		line[j] = c;   //插入\n
		++j;
		++i;
	}
	line[j] = '\0';   //插入\0 ,J有\0,I没有 
	return i;    //i记录字符串的长度,J记录被复制到字符串LINE中的的字符的个数 
}
void re(char s[]) {
	int i = 0;
	while (s[i] != '\n')   //找到换行符
	{
		++i;
	}
	for (int j = i; j >i/2; j--) {
		int temp = s[j];
		s[j] = s[i - j];
		s[i - j] = temp;
	}
}
1.10 外部变量与作用域

声明:说明变量的性质,但是不分配存储单元
定义:创建变量或分配存储单元

#include <stdio.h>
#define MAXLINE 1000
//外部变量
int max;
char line[MAXLINE];
char longest[MAXLINE];
int getline(void);
void copy(void);

int main() {
	int len;
	extern int max;
	extern char longest[];
	max = 0;
	while ((len = getline()) > 0) {
		if (len > max) {
			max = len;
			copy();
		}
	}
	if (max > 0) {
		printf("%s", longest);
	}
	return 0;
}

int getline(void) {
	int  i;char c;
	extern char line[];
	for (i = 0; i < MAXLINE - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
		line[i] = c;
	}
	if (c == '\n') {   //插入\n
		line[i] = c;
		++i;
	}
	line[i] = '\0';   //插入\0
	return i;
}
void copy(void) {
	extern char line[], longest[];
	int i = 0;
	while ((longest[i] = line[i]) != '\0') {
		++i;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/595217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

古墓丽影年度版喜加一 亚马逊免费游戏领取教程+下载安装教程

最近我们的老朋友亚马逊平台又为玩家们带来了一款免费的3A大作&#xff0c;这款游戏作为古墓丽影的续作在全球范围内都有着很高的热度和评价。但是许多玩家不知道这款游戏该如何领取&#xff0c;下面小编就为大家带来详细教程。 在领取之前&#xff0c;我们一定要优化我们的网…

【Js逆向】某博反爬机制的逆向分析

相信很多接触过爬虫的师傅&#xff0c;在对某博进行请求的时候&#xff0c;发现某博是会对cookie校验的&#xff0c;而我们在模拟操作的时候&#xff0c;是直接把浏览器的cookie进行copy&#xff0c;虽然我没有测试过这个cookie的有效期&#xff0c;但我觉得这样只适合日常测试…

LNMP一键安装包

LNMP一键安装包是什么? LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Alibaba/Amazon/Mint/Oracle/Rocky/Alma/Kali/UOS/银河麒麟/openEuler/Anolis OS Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQ…

亚马逊云科技产品测评:玩转云服务器(EC2)

文章目录 &#x1f4d1;引言一、亚马逊发展历史介绍二、云服务器资源地域分布三、云服务器实例规格四、EC2计费模式五、亚马逊免费EC2领取 &#x1f4d1;引言 亚马逊&#xff1a;世界上最大的云服务器提供商 亚马逊云科技 是由亚马逊公司提供的一系列云计算服务。它提供了弹性计…

KNOWLEDGE DISTILLATION BASED ON TRANSFORMED TEACHER MATCHING

摘要 温度标度作为logit匹配和概率分布匹配的bridge技术&#xff0c;在知识蒸馏&#xff08;KD&#xff09;中起着至关重要的作用。传统上&#xff0c;在蒸馏中&#xff0c;温度标度适用于教师的logits和学生的logits。在本文中&#xff0c;受到最近一些研究成果的启发&#x…

Leetcode—622. 设计循环队列【中等】

2024每日刷题&#xff08;128&#xff09; Leetcode—622. 设计循环队列 实现代码 class MyCircularQueue { public:MyCircularQueue(int k): q(k) {qSize k;}bool enQueue(int value) {if(isFull()) {return false;}q[rear] value;rear (rear 1) % qSize;deflag false;…

数据结构相关

数据结构相关 文章目录 数据结构相关[TOC](文章目录)前言一、数据结构介绍二、不同的逻辑结构的存储方案(Java实现)2.1 线性结构&#xff1a;线性表、数组2.2 线性结构&#xff1a;栈2.3 线性结构&#xff1a;队列2.4 树形结构&#xff1a;树 三、一些常见的3.1 布隆过滤器Bloo…

网络安全是否有需求

● 由于网络威胁数量不断增加&#xff0c;网络安全的需求很高。 ● 组织正在大力投资网络安全以保护其数据。 ● 就业市场缺乏熟练的网络安全专业人员。 ● 网络安全认证可以提升您在网络安全领域的职业前景。 ● 持续学习并了解最新的安全趋势在该领域至关重要。 网络安全重磅…

stm32f103zet6_串口实现-DHT11-tim1(定时)

1思路 1打开时钟 1.1使用定时器实现us级的计时 1.2在打开串口 1,3在DHT11驱动中修改引脚 stm32cudeMX 配置 1打开时钟 2打开串口 3打开tim1(定时器) 4生成代码 代码设置 1导入DHT11库(tim.h是定时器的文件系统自动生成的) DHT11.c #include "dht11.h" #inc…

鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步

基本概念 信号量&#xff08;Semaphore&#xff09; 是一种实现任务间通信的机制&#xff0c;可以实现任务间同步或共享资源的互斥访问。 一个信号量的数据结构中&#xff0c;通常有一个计数值&#xff0c;用于对有效资源数的计数&#xff0c;表示剩下的可被使用的共享资源数…

咖啡机定量出水的原理是什么

咖啡机实现定量出水的原理主要依赖于流量计的使用。流量计是一种能够测量液体或气体通过管道的速度和体积的装置。在咖啡机中&#xff0c;常用的小型流量计有霍尔式流量计和光电式流量计两种。 霍尔式流量计利用了霍尔效应的原理来实现流量测量。它包含一个带有两极磁铁的叶轮…

信创基础软件之操作系统

操作系统概述 操作系统是计算机系统软硬件资源的纽带。操作系统是连接硬件和数据库、中间件、应用软件的纽带&#xff0c;是承载各种信息设备和软件应用的重要基础软件。操作系统控制和管理整个计算机系统的硬件、软件资源&#xff0c;组织和调度计算机工作和资源&#xff0c;…

等保建设技术建议书(Word原件)

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

C语言结构体类型

C语言结构体类型 个人主页&#xff1a;大白的编程日记 个人主页&#xff1a;C语言学习之路 文章目录 C语言结构体类型前言一.结构体1.1结构体类型的声明1.2结构体变量的创建和初始化1.3结构成员访问操作符1.4结构的特殊声明1.5 结构的自引用 二.结构体内存对齐2.1对齐规则2.2内…

嵌入式linux学习第一天

参考正点原子Linux开发文档。记录下知识点。 Shell 基本操作 前面我们说 Shell 就是“敲命令”&#xff0c;那么既然是命令&#xff0c;那肯定是有格式的&#xff0c;Shell 命令的格式 如下&#xff1a; command -options [argument] command: Shell 命令名称。 options&…

27 JavaScript学习:异步编程

异步的概念 在JavaScript中&#xff0c;异步编程是一项重要的概念&#xff0c;特别在处理用户交互、网络请求和文件读写等场景下非常常见。JavaScript是一门单线程语言&#xff0c;因此需要通过异步编程来避免阻塞主线程&#xff0c;保证程序的流畅性和响应性。 在JavaScrip…

避雷!7.7分,新增1区TOP被标记On Hold,5本已被踢除!

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

[入门] Unity Shader前置知识(5) —— 向量的运算

在Unity中&#xff0c;向量无处不在&#xff0c;我想很多人都使用过向量类的内置方法 normalized() 吧&#xff0c;我们都知道该方法是将其向量归一化从而作为一个方向与速度相乘&#xff0c;以达到角色朝任一方向移动时速度都相等的效果&#xff0c;但内部具体是如何将该向量进…

力扣每日一题109:有序链表转换二叉搜索树

题目 中等 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为 平衡 二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0&#xff0c;-3,9&#xff0c;-10,null,5]&#xff0c;它…

Java毕设之学院党员管理系统的设计与实现

运行环境 环境说明: 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9 系统实现 管理员功能实现 党员管理 管理员进入指定功能操作…