编程练习:
1.
编写一个程序,从标准输入读取几行输入。
每行输入都要打印到标准输出上,前面要加上行号。
在编写这个程序时要试图让程序能够处理的输入行的长度没有限制。
分析: 通过从输入中逐字符进行读取而不是逐行进行读取,可以避免行长度限制
程序如下:
//从标准输入复制到标准输出,并对输出行标号
#include<stdio.h>
#include<stdlib.h>
int main()
{
int ch; //一行字符
int line; //行号
int at_beginning; //判断是否为句首
line = 0; //行号赋初值
at_beginning = 1; //为判断句首变量赋初值
//读取字符并逐个处理它们
while ((ch = getchar()) != EOF){
//getchar函数将从标准输入读取一个字符返回它的值并赋给变量ch再与EOF进行比较
//若处在一行的起始位置,打印行号
if (at_beginning == 1) {
at_beginning = 0; //句首标志变量赋零
line += 1; //行号加一
printf("%d", line);
}
//打印字符,并对行尾进行检查
putchar(ch);
if (ch == '\n')
at_beginning = 1;
}
return EXIT_SUCCESS;
}
运行结果:
注:输入字符的时候有逐行增加空格~
2.
编写一个程序,从标准输入读取一些字符,并把它们写到标准输出上。它同时应该计算checksum值,并写在字符的后面。checksum(检验和)用一个signed char类型的变量进行计算,它的初始为1。当每个字符从标准输入读取时,它的值就被加到checksum中。如果checksum变量产生了溢出,那么这些溢出就会被忽略。当所有的字符均被写入后,程序以十进制整数的形式打印出checksum的值,它有可能是负值。
注意在checksum后面要添加一个换行符。
在使用ASCII码的计算机中,在包含“hello world!”这几个词以换行符结尾的文件上运行这个程序应该产生下列输出:
Hello world!
102
程序如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char ch; //一行字符
signed char checksum=-1;
while ((ch = getchar()) != EOF){
putchar(ch);
checksum=checksum+ch;
if (ch == '\n')
{printf("%d\n",checksum);
checksum=-1;
}
}
}
运行结果:
3.
编写一个程序。一行行地读取输入行,直至到达文件尾。
算出每行输入行的长度,然后把最长的那行打印出来。
为了简单起见,你可以假定所有的输入行均不超过1000个字符。
程序如下:
#include<stdio.h>
#include<string.h>
#define MAX 1000
int main()
{ char ch; //输入字符串
char temp[MAX]; //保存输入的字符串
char length[MAX]; // 保存输入中最长的字符串
while((ch=getchar())!=EOF)
{ //将输入的字符由getchar一个个返回并存放在数组temp中
for(int i=0;ch!='\n';i++)
{
//这两行不可交换
//应先将ch中的字符串放入temp中,再放入从getchar中输入的新字符串
//否则输出会发生缺少字符串的现象
temp[i]=ch;
ch=getchar();
}
//比较数组temp与数组length中字符的长度
//如果temp中字符长度大于length中字符长度
//使用strcpy将temp中字符copy到length中
if( strlen(temp) > strlen(length) )
strcpy (length,temp);
}
printf("%s %d",length,strlen(length));
return 0;
}
运行结果:
注:EOF(end of file) 在window环境下的GCC(GNU编译器集合)中可以用ctrl+z表示文件结束,而在Linux环境下的GCC中可以使用ctrl+d表示文件结束。
这是一篇从七月拖到八月的博客…
最近有些焦虑 所以开始继续写博客静静心
果然还是吹着空调听着纯音乐敲代码改程序更合我心意
Emmm内容如若有误 望博友指出 不胜感激~