精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

解析C語言入門基礎之輸入和輸出

電子工程師 ? 來源:編程學習總站 ? 作者:寫代碼的牛頓 ? 2021-05-31 14:05 ? 次閱讀

01

標準輸入和標準輸出

C語言里要使用標準輸入和標準輸出必須包含stdio.h頭文件,常用的標準輸出和標準輸入函數是printf和scanf,其中printf用來在標準輸出中輸出信息,而函數scanf則用來從標準輸入中讀取信息。

那么什么是標準輸入和標準輸出呢?

Linux中進程通常會自動打開三個標準文件,即標準輸入文件(stdin)通常對應文件描述符0;

標準輸出文件(stdout)對應文件描述符1和標準錯誤輸出文件對應文件描述符2(stderr)。進程將從標準輸入文件中讀取輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。02

標準輸入函數

在stdio.h中scanf聲明如下:

/* Read formatted input from stdin. This function is a possible cancellation point and therefore not marked with __THROW. */ extern int scanf (const char *__restrict __format, 。。.) __wur;

使用Mac或Linux的同學,在終端上輸入man scanf回車即可學習scanf函數的用法。我們可以看到注釋上說明,scanf從標準輸入stdin輸入讀取數據,在glibc中stdin的定義如下:

/*stdio.c*/ FILE *stdin = (FILE *) &_IO_2_1_stdin_; /*libio.h*/ extern struct _IO_FILE_plus _IO_2_1_stdin_; /*libioP.h*/ struct _IO_FILE_plus { FILE file; const struct _IO_jump_t *vtable; };

從以上代碼我們可以知道,最終stdin是一個FILE文件流指針,我能繼續追蹤FILE類型為何物。

/* * stdio state variables. * * The following always hold: * * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), * _lbfsize is -_bf._size, else _lbfsize is 0 * if _flags&__SRD, _w is 0 * if _flags&__SWR, _r is 0 * * This ensures that the getc and putc macros (or inline functions) never * try to write or read from a file that is in `read‘ or `write’ mode. * (Moreover, they can, and do, automatically switch from read mode to * write mode, and back, on “r+” and “w+” files.) * * _lbfsize is used only to make the inline line-buffered output stream * code as compact as possible. * * _ub, _up, and _ur are used when ungetc() pushes back more characters * than fit in the current _bf, or when ungetc() pushes back a character * that does not match the previous one in _bf. When this happens, * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. * * NB: see WARNING above before changing the layout of this structure! */ typedef struct __sFILE { unsigned char *_p; /* current position in (some) buffer */ int _r; /* read space left for getc() */ int _w; /* write space left for putc() */ short _flags; /* flags, below; this FILE is free if 0 */ short _file; /* fileno, if Unix descriptor, else -1 */ struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ int _lbfsize; /* 0 or -_bf._size, for inline putc */ /* operations */ void *_cookie; /* cookie passed to io functions */ int (* _Nullable _close)(void *); int (* _Nullable _read) (void *, char *, int); fpos_t (* _Nullable _seek) (void *, fpos_t, int); int (* _Nullable _write)(void *, const char *, int); /* separate buffer for long sequences of ungetc() */ struct __sbuf _ub; /* ungetc buffer */ struct __sFILEX *_extra; /* additions to FILE to not break ABI */ int _ur; /* saved _r when _r is counting ungetc data */ /* tricks to meet minimum requirements even when malloc() fails */ unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ unsigned char _nbuf[1]; /* guarantee a getc() buffer */ /* separate buffer for fgetln() when line crosses buffer boundary */ struct __sbuf _lb; /* buffer for fgetln() */ /* Unix stdio files get aligned to block boundaries on fseek() */ int _blksize; /* stat.st_blksize (may be != _bf._size) */ fpos_t _offset; /* current lseek offset (see WARNING) */ } FILE;

看到這個結構體內部一大堆成員變量不要慌,我們重點關注里面的close、read、seek和write函數指針。我們在調用scanf函數時正是通過這幾個函數指針間接調用系統函數close、read、seek和write實現標準輸入關閉、讀取、偏移和寫功能。

int (* _Nullable _close)(void *); int (* _Nullable _read) (void *, char *, int); fpos_t (* _Nullable _seek) (void *, fpos_t, int); int (* _Nullable _write)(void *, const char *, int);

從函數聲明我們知道scanf返回一個int型返回值,在調用時scanf,返回正整數表示從標準輸入讀取到的有效數據數量,返回0表示沒有輸入或者輸入不正確,返回負數表示發生了從標準輸入讀取數據發生了錯誤。下面我們使用scanf從標準輸入讀取數據的代碼。

int num = 0; float f_num = 0; int count = scanf(“%d”, &num); scanf(“%f”, &f_num); scanf_s(“%d”, &num);

在scanf中輸入數據并將數據保存在變量num和f_num中,調用scanf輸入數據必須要用%,%d表示輸入一個整數,%f表示輸入一個單精度浮點數,其他數據類型的數據參考C語言入門基礎之變量和數據類型,count保存scanf輸入數據的有效數。

看到這里可能有人會有疑問,為什么調用scanf從標準輸入信息,需要對變量取地址,為什么要設計成這樣?這里就要涉及到后面會學到的知識:指針。在C語言里函數傳參方式有2種,一種是傳值另外一種是傳指針。通過傳值方式形參拷貝實參,得到一個實參副本對實參副本進行修改不會影響實參,而傳指針方式,將會得到實參的地址,通過指針解引用可以間接修改實參的值。

那么回到scanf函數那里,我們通過對變量進行取址,scanf函數內部有一個指針,將變量地址值賦給內部指針,再將標準輸入的值賦值給實參,實參變量因此獲得標準輸入的值。

在代碼片段我們還看到scanf_s這個函數(scanf_s不是C標準庫函數),由于scanf函數并不是安全的,在有些編輯器上默認禁止使用scanf,如果使用則需要打開一個宏,而scanf_s是一些廠商提供的scanf函數安全版本,兩者使用方法一模一樣。

03

標準輸出函數

在stdio.h中printf函數聲明如下:

/* Write formatted output to stdout. This function is a possible cancellation point and therefore not marked with __THROW. */ extern int printf (const char *__restrict __format, 。。.);

看到這里是不是很熟悉?printf函數的返回值也是int型,調用printf函數將會返回輸出字符個數,出錯則返回一個負數。

同樣在Linux/Mac平臺的終端上輸入man printf函數可以查看函數的詳細使用方法(任何C標準函數都可以在Linux/Mac平臺上輸入man+函數名的方式查看函數使用方法)。下面是我們使用printf函數在標準輸出中輸出數據的代碼。

int output_count = printf(“num = %d ”, num); printf(“output_count = %d ”, output_count); output_count = printf(“f_num = %f ”, f_num); printf(“output_count = %d ”, output_count);

在代碼片段里我們看到一個 字符,在C語言里這是一個換行符。看到這里是不是又有疑問了,為什么printf函數輸出變量值時不需要對變量取地址?這就回到前面我們說過的問題了,在C語言里傳值,形參是實參的副本,形參修改了不會影響到實參。而printf函數只是在標準輸出中輸出信息,不會修改實參的值,因此使用傳值方式。

那么標準輸出是什么呢?從print函數聲明代碼注釋上看,標準輸出正是stdou,我們繼續在glibc中繼續追蹤stdout到底是什么?在stdout.c中我們看到stdout和stderr定義如下:

FILE *stdout = (FILE *) &_IO_2_1_stdout_; FILE *stderr = (FILE *) &_IO_2_1_stderr_;

我們發現stdout、stderr和stdin的定義一模一樣都是一個FILE類型指針,那么使用方式就和stdin一樣了,區別則在于stdin和文件描述符0綁定,stdout和文件描述符1綁定,stderr和文件描述符2綁定。

04

結語

后面講解C語言知識時我會穿插有Linux相關知識,講解C語言不能僅僅停留在語法層面。據我的觀察,很多人學習了C語言語法后很迷茫,不知道C語言能做什么,根本原因就是你沒有了解某個平臺的系統編程API。Linux是一個開源操作系統,結合Linux學習C語言將會更加有趣,在Linux上進行C語言開發絕對是最佳選擇。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11230

    瀏覽量

    208933
  • C語言
    +關注

    關注

    180

    文章

    7599

    瀏覽量

    136213
  • File
    +關注

    關注

    0

    文章

    19

    瀏覽量

    14326
  • 函數
    +關注

    關注

    3

    文章

    4307

    瀏覽量

    62433
  • 代碼
    +關注

    關注

    30

    文章

    4751

    瀏覽量

    68358

原文標題:C語言入門基礎之輸入和輸出

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對C
    的頭像 發表于 10-29 17:31 ?212次閱讀

    FPGA編程語言入門教程

    FPGA(現場可編程邏輯門陣列)的編程涉及特定的硬件描述語言(HDL),其中Verilog和VHDL是最常用的兩種。以下是一個FPGA編程語言(以Verilog為例)的入門教程: 一、Verilog
    的頭像 發表于 10-25 09:21 ?156次閱讀

    TMS320LF240x DSP的C語言和匯編代碼快速入門

    電子發燒友網站提供《TMS320LF240x DSP的C語言和匯編代碼快速入門.pdf》資料免費下載
    發表于 10-18 10:14 ?0次下載
    TMS320LF240x DSP的<b class='flag-5'>C</b><b class='flag-5'>語言</b>和匯編代碼快速<b class='flag-5'>入門</b>

    模擬DAC38RF8x輸入/輸出緩沖器信息的快速入門方法

    電子發燒友網站提供《模擬DAC38RF8x輸入/輸出緩沖器信息的快速入門方法.pdf》資料免費下載
    發表于 10-09 11:21 ?0次下載
    模擬DAC38RF8x<b class='flag-5'>輸入</b>/<b class='flag-5'>輸出</b>緩沖器信息的快速<b class='flag-5'>入門</b>方法

    技術干貨驛站 ▏深入理解C語言:編程高手必備,全方位解析運算符的核心技能!

    過程中發揮著重要作用,還對程序的性能和穩定性產生直接影響。繼上一期對C語言常量的深入分析后,本文將進一步探討C語言中的常用運算符,詳細解析
    的頭像 發表于 09-18 15:56 ?315次閱讀
    技術干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:編程高手必備,全方位<b class='flag-5'>解析</b>運算符的核心技能!

    誤差放大器的輸入輸出關系

    誤差放大器(Error Amplifier)在電子測量和控制系統中扮演著至關重要的角色,其輸入輸出關系對于理解和設計這些系統至關重要。以下是對誤差放大器輸入輸出關系的詳細解析,包括其工作原理、
    的頭像 發表于 09-11 15:32 ?977次閱讀

    C語言中的輸入&amp;輸出

    int printf(const char *format, ...) 函數把輸出寫入到標準輸出流 stdout ,并根據提供的格式產生輸出
    發表于 02-28 11:17 ?458次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的<b class='flag-5'>輸入</b>&amp;<b class='flag-5'>輸出</b>

    ArkTS語言基礎類庫-解析

    被設計用來傳輸和存儲數據,是一種可擴展標記語言語言基礎類庫提供了[XML生成、解析與轉換]的能力。 URL、URI構造和解析能力:其中[URI]是統一資源標識符,可以唯一標識一個資源
    發表于 02-20 16:44

    plc編程語言c語言的聯系 c語言和PLC有什么區別

    PLC編程語言C語言的聯系 PLC(可編程邏輯控制器)是一種針對自動化控制系統的特殊計算機。PLC編程語言是為了控制和管理自動化生產過程中的各種設備而設計的。與
    的頭像 發表于 02-05 14:21 ?3883次閱讀

    c語言,c++,java,python區別

    操作系統、嵌入式系統等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言入門語言
    的頭像 發表于 02-05 14:11 ?2244次閱讀

    vb語言c++語言的區別

    Microsoft開發的一種面向對象的事件驅動編程語言。它的設計目標是簡化編程過程,讓初學者也能快速上手。與相比,C++語言是一種通用的、面向對象的編程
    的頭像 發表于 02-01 10:20 ?2071次閱讀

    C語言數據結構跳表詳解

    大家好,今天分享一篇C語言數據結構相關的文章--跳表。
    的頭像 發表于 12-29 09:32 ?794次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>數據結構<b class='flag-5'>之</b>跳表詳解

    C語言構建高效的嵌入式程序

    嵌入式工程師在編寫C語言程序時,需要注重效率和清晰的思路。本文將通過解析經典問題“猴子選大王”來展示如何用C語言思維方式構建高效、清晰的程序
    的頭像 發表于 12-21 09:27 ?600次閱讀

    C語言運行環境是什么

    C語言運行環境(C language runtime environment)是指在執行C語言程序時所需的軟件及硬件環境。
    的頭像 發表于 11-27 16:13 ?3354次閱讀

    如何選擇創建c語言c++

    選擇創建 C 語言C++ 都需要綜合考慮多個因素。在決定使用哪種語言之前,我們需要對這兩種語言的特點、優缺點、適用場景、學習成本等進行全
    的頭像 發表于 11-27 15:58 ?571次閱讀