【心得】Ctrl+Z、\n、\0、eof的区别和用法

从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

    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_s
    printf( "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 ); // C4996
    wprintf( 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 characters

The 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对特殊符号的返回值

  1. 自然数:符合输入格式的数据的个数

  2. 0:不符合输入格式的数据(如果Ctrl+Z和回车键之间有其他字符,则也返回0)

  以"%d"为例:要求是十进制整数,如果输入字符'r'、'e'、'\'等,就返回0,自然地,'\n''\0''eof'也返回0,这与他们本身的含义(比如换行符、终止符、文件结束符)并无关系
  1. -1:Ctrl+Z(紧接着按下回车键)

三、输入流中Ctrl+Z的含义

注:Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。本程序是在Windows系统下,因此使用阻塞式的 Ctrl+Z 来标识流的结束。

阻塞式方式的特点:

  1. 只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。

  2. (按照输入时间顺序读取输入缓冲区的数据)读取到Ctrl+Z时,如果后面有可读的数据,则不会理睬Ctrl+Z,也就是不认为Ctrl+Z代表着流的末尾。(因为有要读的数据,还不能认为到了流的末尾)。

  3. Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。

四、键盘输入时回车键的作用:

 将键盘上敲下的字符送入输入缓冲区。 

如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续的输入函数(比如scanf()、getchar())调用读取。也就是说,后续的scanf()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。

对于scanf(),只有字符char在输入流中的获取会承认空格或回车中的换行符为所要取的值,别的如字符串或者字符数组或int类型均不认为空格或回车中的换行符为其值即丢弃空格符和回车符,以空格作为划分。

五、那换行符'n'、终止符'0'、文件结束符'eof'是干嘛的

  1. 'n'、'0'、'eof'是C/C++编译器在编译代码时识别的符号。

  2. Ctrl+Z是操作系统在处理输入流时识别的符号。

'\n'换行符,

# include 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 int main(){    int c;    do    {        printf("请输入文档的结尾标志");    }while((c=getchar())!='\0');    printf("已得到文档结束标志\n");    //死循环    return 0;} 

'eof'文件结束符

# include int main(){    int c;    do    {        printf("请输入文档的结尾标志");    }while((c=getchar())!=EOF);    printf("已得到文档结束标志\n");    //Ctrl+Z然后回车    return 0;} 

在控制台输入的时候,操作系统将Ctrl+Z翻译为文档结束符。

c++# c, windows

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部