【心得】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.ide

// 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_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

2、scanf對特殊符號的返回值

  • 天然數:符合輸入格式的數據的個數函數

  • 0:不符合輸入格式的數據(若是Ctrl+Z和回車鍵之間有其餘字符,則也返回0)操作系統

    以"%d"爲例:要求是十進制整數,若是輸入字符'r'、'e'、'\'等,就返回0,天然地,'\n''\0''eof'也返回0,這與他們自己的含義(好比換行符、終止符、文件結束符)並沒有關係
  • -1:Ctrl+Z(緊接着按下回車鍵)翻譯

3、輸入流中Ctrl+Z的含義

注:Windows系統中通常採用阻塞式檢查 Ctrl+Z、Unix/Linux系統下通常採用非阻塞式的檢查 Ctrl+D。本程序是在Windows系統下,所以使用阻塞式的 Ctrl+Z 來標識流的結束。code

阻塞式方式的特色:orm

  1. 只有按下回車以後纔有可能檢測在此以前是否有Ctrl+Z按下。文檔

  2. (按照輸入時間順序讀取輸入緩衝區的數據)讀取到Ctrl+Z時,若是後面有可讀的數據,則不會理睬Ctrl+Z,也就是不認爲Ctrl+Z表明着流的末尾。(由於有要讀的數據,還不能認爲到了流的末尾)。字符串

  3. Ctrl+Z產生的不是一個普通的ASCII碼值,也就是說它產生的不是一個字符,因此不會跟其它從鍵盤上輸入的字符同樣可以存放在輸入緩衝區。get

4、鍵盤輸入時回車鍵的做用:

將鍵盤上敲下的字符送入輸入緩衝區。

若是用戶在按回車鍵以前輸入了不僅一個字符,其餘字符會保留在鍵盤緩衝區中,等待後續的輸入函數(好比scanf()、getchar())調用讀取。也就是說,後續的scanf()調用不會等待用戶按鍵,而是直接讀取緩衝區中的字符,直到緩衝區的字符讀取完畢後,纔等待用戶按鍵。

對於scanf(),只有字符char在輸入流中的獲取會認可空格或回車中的換行符爲所要取的值,別的如字符串或者字符數組或int類型均不認爲空格或回車中的換行符爲其值即丟棄空格符和回車符,以空格做爲劃分。

5、那換行符'\n'、終止符'\0'、文件結束符'eof'是幹嗎的

  1. '\n'、'\0'、'eof'是C/C++編譯器在編譯代碼時識別的符號。

  2. 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翻譯爲文檔結束符。

相關文章
相關標籤/搜索