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中。注意換行符號會被轉換為‘