问题一:对输入的单词计数
解法一:
#include <stdio.h>
#define IN 1
#define OUT 0
int main(void)
{
int c,cnt,flag;
cnt = 0;
flag = OUT; //在单词外
while ( (c=getchar()) != EOF)
{
if (c==' ' || c=='\t' || c=='\n')
flag = OUT;
else if (flag==OUT)
{
flag = IN;
++cnt;
}
}
printf("%d\n",cnt);
return 0;
}
总结:设置标志位,得明白标志位是什么意思,以及标志位什么时候需要改变,注意标志位的改变一定是成双的。
问题二:编写函数getline(char line[],int len)从输入读取一行数据(不包含\n)到 line中,且返回字符串的长度(限定字符串长度最长是len )
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int len);
int main(void)
{
char line[MAXLINE];
int len = getline(line,MAXLINE);
printf("%s %d",line,len);
return 0;
}
int getline(char line[], int len)
{
int c,cnt;
cnt = 0;
while ( (c=getchar())!=EOF && c!='\n' && cnt<len)
{
line[cnt++] = c;
}
line[cnt] = '\0';
return cnt;
}
问题三:从输入读入一组文本行,并将最长的文本行打印出来
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int len);
void copy(char src[], char des[]);
int main(void)
{
int len; /*当前行长度*/
int 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)
puts(longest);
return 0;
}
int getline(char line[], int len)
{
int c,cnt;
cnt = 0;
while ( (c=getchar())!=EOF && c!='\n' && cnt<len)
{
line[cnt++] = c;
}
line[cnt] = '\0';
return cnt;
}
void copy(char des[], char src[])
{
int i = 0;
// while ( (des[i++]=src[i++]) != '\0'); 一个错误写法 i已经加了两次了
while ( (des[i]=src[i]) != '\0')
++i;
}
总结:(1)其实写程序先把框架写出来就好,以上的程序框架如下:
while (还有未处理的行)
if (该行比已处理的最长行还要长)
保存该行
保存该行的长度
打印最长的行
(2)还有以上注释的错误,以后需要注意注意。