从scanf谈起:
一:scanf的返回值:读入的域的个数
int scanf(
const char *format [,
argument]...
);
int _scanf_l(
const char *format,
locale_t locale [,
argument]...
);
int wscanf(
const wchar_t *format [,
argument]...
);
int _wscanf_l(
const wchar_t *format,
locale_t locale [,
argument]...
);
Return Value
Returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned.
If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return EOF and set errno to EINVAL.
For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.
// crt_scanf.c
// compile with: /W3
/* This program uses the scanf and wscanf functions
* to read formatted input.
*/
#include <stdio.h>
int main( void )
{int i, result;float fp;char c, s[81];wchar_t wc, ws[81];result = scanf( "%d %f %c %C %80s %80S", &i, &fp, &c, &wc, s, ws ); // C4996// Note: scanf and wscanf are deprecated; consider using scanf_s and wscanf_sprintf( "The number of fields input is %d\n", result );printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);result = wscanf( L"%d %f %hc %lc %80S %80ls", &i, &fp, &c, &wc, s, ws ); // C4996wprintf( L"The number of fields input is %d\n", result );wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws);
}71 98.6 h z Byte characters
36 92.3 y n Wide charactersThe number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters
二、scanf对特殊符号的返回值
自然数:符合输入格式的数据的个数
-
0:不符合输入格式的数据(如果Ctrl+Z和回车键之间有其他字符,则也返回0)
以"%d"为例:要求是十进制整数,如果输入字符'r'、'e'、'\'等,就返回0,自然地,'\n''\0''eof'也返回0,这与他们本身的含义(比如换行符、终止符、文件结束符)并无关系
-1:Ctrl+Z(紧接着按下回车键)
三、输入流中Ctrl+Z的含义
注:Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。本程序是在Windows系统下,因此使用阻塞式的 Ctrl+Z 来标识流的结束。
阻塞式方式的特点:
只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。
(按照输入时间顺序读取输入缓冲区的数据)读取到Ctrl+Z时,如果后面有可读的数据,则不会理睬Ctrl+Z,也就是不认为Ctrl+Z代表着流的末尾。(因为有要读的数据,还不能认为到了流的末尾)。
Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。
四、键盘输入时回车键的作用:
将键盘上敲下的字符送入输入缓冲区。
如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续的输入函数(比如scanf()、getchar())调用读取。也就是说,后续的scanf()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
对于scanf(),只有字符char在输入流中的获取会承认空格或回车中的换行符为所要取的值,别的如字符串或者字符数组或int类型均不认为空格或回车中的换行符为其值即丢弃空格符和回车符,以空格作为划分。
五、那换行符'\n'、终止符'\0'、文件结束符'eof'是干嘛的
'\n'、'\0'、'eof'是C/C++编译器在编译代码时识别的符号。
Ctrl+Z是操作系统在处理输入流时识别的符号。
'\n'换行符,
#include <stdio.h>
int main()
{int c;do{printf("请输入文档的结尾标志");}while((c=getchar())!='\n');printf("已得到文档结束标志\n"); //直接回车return 0;
}
'\0'终止符
'\0' is the null termination character. It marks the end of the string.
char cAlphabet[] = "I know all about programming!";
is the same as
char cAlphabet[] = {'I',' ', 'k','n','o','w',' ','a','l','l',' ','a','b','o','u','t',' ','p','r','o','g','r','a','m','i','n','g','!','\0'};
#include <stdio.h>
int main()
{int c;do{printf("请输入文档的结尾标志");}while((c=getchar())!='\0');printf("已得到文档结束标志\n");return 0;
}
'eof'文件结束符
#include <stdio.h>
int main()
{int c;do{printf("请输入文档的结尾标志");}while((c=getchar())!=EOF);printf("已得到文档结束标志\n"); //Ctrl+Z然后回车return 0;
}
在控制台输入的时候,操作系统将Ctrl+Z翻译为文档结束符。