int main(){
char s[100]={0};
char *p=s;
int num=0,flag=0,wnum=0,line=0;
while ((gets(s))!=EOF) {
if ((*p>='a'||*p<='z')||(*p>='Z'||*p<='A')) {
wnum++;
if (flag==0) {
*p-=32;
}
flag=1;
}
else{
if (flag==1){
num++;
flag=0;
}
if (*p=='\n'||*p=='\0') {
line++;
}
}
p++;
}
int ave=wnum/num;
printf("Number of lines: %d\nNumber of words: %d\nAverage length of a word: %d",line,num,ave);
}
输入多行之后,command+z还是结束不了输入
请问问题在哪里?
有什么更好的接受多行文字的方法吗?
这是原题,希望不是我错误理解题意了……
谢谢...
伊谢尔伦2017-04-17 13:13:55
楼主试试在printf
之前输出num
,很大概率是等于0的。
最严重的问题:
、*(如果以下看不懂请移动至最下面,对gets()函数的分析)*、
1、gets(s)
每次返回一行而不是一次性返回EOF之前的全部字符!楼主可能是这一点想错了,如果不是请看下面的分析。
2、为什么num=0? gets(s)
每次读一行,s是字符串,楼主每次只判断了一个字符*p,就继续下一次循环了,输入的样例很可能会导致num=0的就是num++那句不会执行。应该再加一重循环while(*p!=' ')
判断s里的每个字符。
3、每次判断一行数字,p就应该从s的开头开始,所以 char *p=s
应该放在while(get(s))
这个循环里面。
其他的方法我推荐用while((ch=getchar())!=EOF)
,这个你的思路挺符合的,一个字符一个字符判断,你可以去搜这句,挺经典的。
int getchar ( void)
返回值为用户输入的ASCII码,读到文件末尾返回EOF,EOF的值是-1
从方法上说,可以用空格或换行判断单词数,'n'判断行数。按照题目来说应该是没有句号或逗号的。
比如
char ch;
while((ch=getchar())!=EOF){
if(ch=='\n') {
lineNum++;
wordNum++;
}
else if(ch==' ') {
wordNum++;
}
printf("%d %d",lineNum,wordNum);
while(1); // 按Ctrz+z后卡死在这里可以看输出的结果
我测试了下,目测正确。
抱歉,之前没仔细看代码,就看了一行while(gets(s)!=EOF)
。就直接写答案了,刚刚想起其实好像也没什么问题,所以去看了你的代码。
之前的回答:
楼主用的是C编译器的吧,我用C++编译器编译不过的。ERROR:ISO C++ forbids comparison between pointer and integer
。
gets() 错了,gets()返回的是指针,EOF是int整数,应该用while(gets(s)!=NULL)
。
如下:
函数原型是char * gets (char * buffer ); 读取成功返回和buffer相同的指针,遇到错误或EOF返回NULL。
执行时,不断从stdin读取字符,遇到换行符或EOF时停止,并将读取的结果存放在buffer中。注意换行符会被转换为‘ ’(空字符),加在buffer的后面。