请问c语言中什么情况下按下回车键enter后程序就停止执行了,什么情况下按下回车键enter后还能继续输入?
下面附上使我困惑的代码:一般来说在键盘上输入enter之后控制台不就开始给我们反馈信息了吗?
但是在这个程序中输入enter起到的是一个换行的作用:
此程序是C primer plus第六版第167页上的,目的是:
编写一个统计单词数量的程序,还可以计算字符数和行数。
}
#include<stdio.h>
#include<stdbool.h>//为bool、true、false提供定义
#include<ctype.h>为isspace()函数提供原型
#define STOP '|'
int main(){
char c;//读入字符
char prev;//读入的前一个字符
long n_chars=0L;//字符数
int n_lines=0;//行数
int n_words=0;//单词数
int p_lines=0;//不完整的行数
bool inword=false;//如果c在单词中,inword等于true
printf("Enter text to be amalyzed(|to terminate):\n");
prev='\n';//用于识别完整的行
while((c=getchar())!=STOP){
n_chars++;//统计字符
if(c== '\n')
n_lines++;//统计行
if(!isspace(c)&&!inword){
inword=true;//开始一个新的单词
n_words++;//统计单词
}
if(isspace(c)&&inword)
inword=false;//到达单词的末尾
prev=c;//保存字符的值
}
if(prev!='\n')
p_lines=1;
printf("characters=%ld,words=%d,lines=%d,",
n_chars,n_words,n_lines);
printf("partial lines= %d\n",p_lines);
return 0;
因为你读取字符用的是getchar(),用getchar()的时候,enter键会作为一个字符\n输入,所以不会结束。
使用enter键结束输入的情况一般有:
scanf、gets
当使用scanf函数和gets函数读取数据时,会使用enter键来触发刷新缓存事件,让程序从标准输入中读取数据。
而getchar这种读取单个字符的函数,enter键(\n)会作为一个字符被读取。
不同的读取函数,读取机制是不同的,scanf、gets这类可以读取多个字符的函数,需要有一个机制来告诉编译器本次输入结束了。
scanf中,一般用空格、enter键触发缓存刷新事件,告诉编译器本次读取完毕。空格和enter会被忽略。
gets是逐行读取字符串,使用enter键来触发内存刷新事件,告诉编译器本次读取完毕。enter会被忽略。
getchar则是逐个读取字符,会把所有的按键输入都作为一个字符读取到缓存中,getchar也需要enter来刷新缓存,但是enter也会被当作一个字符读取到缓存中,不会被忽略。
在你的代码中,是用 ‘|’ 字符来结束循环的,'\n'不等于'|',所以循环不会结束。
#define STOP '|'
while((c=getchar())!=STOP) // 结束的条件是‘|’ 字符,而不是enter键即'\n'。