欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解析C語言入門基礎(chǔ)之輸入和輸出

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

01

標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出

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

那么什么是標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出呢?

Linux中進(jìn)程通常會(huì)自動(dòng)打開三個(gè)標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件(stdin)通常對(duì)應(yīng)文件描述符0;

標(biāo)準(zhǔn)輸出文件(stdout)對(duì)應(yīng)文件描述符1和標(biāo)準(zhǔn)錯(cuò)誤輸出文件對(duì)應(yīng)文件描述符2(stderr)。進(jìn)程將從標(biāo)準(zhǔn)輸入文件中讀取輸入數(shù)據(jù),將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯(cuò)誤信息送到標(biāo)準(zhǔn)錯(cuò)誤文件中。02

標(biāo)準(zhǔn)輸入函數(shù)

在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的同學(xué),在終端上輸入man scanf回車即可學(xué)習(xí)scanf函數(shù)的用法。我們可以看到注釋上說明,scanf從標(biāo)準(zhǔn)輸入stdin輸入讀取數(shù)據(jù),在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是一個(gè)FILE文件流指針,我能繼續(xù)追蹤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;

看到這個(gè)結(jié)構(gòu)體內(nèi)部一大堆成員變量不要慌,我們重點(diǎn)關(guān)注里面的close、read、seek和write函數(shù)指針。我們?cè)谡{(diào)用scanf函數(shù)時(shí)正是通過這幾個(gè)函數(shù)指針間接調(diào)用系統(tǒng)函數(shù)close、read、seek和write實(shí)現(xiàn)標(biāo)準(zhǔn)輸入關(guān)閉、讀取、偏移和寫功能。

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);

從函數(shù)聲明我們知道scanf返回一個(gè)int型返回值,在調(diào)用時(shí)scanf,返回正整數(shù)表示從標(biāo)準(zhǔn)輸入讀取到的有效數(shù)據(jù)數(shù)量,返回0表示沒有輸入或者輸入不正確,返回負(fù)數(shù)表示發(fā)生了從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)發(fā)生了錯(cuò)誤。下面我們使用scanf從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)的代碼。

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

在scanf中輸入數(shù)據(jù)并將數(shù)據(jù)保存在變量num和f_num中,調(diào)用scanf輸入數(shù)據(jù)必須要用%,%d表示輸入一個(gè)整數(shù),%f表示輸入一個(gè)單精度浮點(diǎn)數(shù),其他數(shù)據(jù)類型的數(shù)據(jù)參考C語言入門基礎(chǔ)之變量和數(shù)據(jù)類型,count保存scanf輸入數(shù)據(jù)的有效數(shù)。

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

那么回到scanf函數(shù)那里,我們通過對(duì)變量進(jìn)行取址,scanf函數(shù)內(nèi)部有一個(gè)指針,將變量地址值賦給內(nèi)部指針,再將標(biāo)準(zhǔn)輸入的值賦值給實(shí)參,實(shí)參變量因此獲得標(biāo)準(zhǔn)輸入的值。

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

03

標(biāo)準(zhǔn)輸出函數(shù)

在stdio.h中printf函數(shù)聲明如下:

/* 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函數(shù)的返回值也是int型,調(diào)用printf函數(shù)將會(huì)返回輸出字符個(gè)數(shù),出錯(cuò)則返回一個(gè)負(fù)數(shù)。

同樣在Linux/Mac平臺(tái)的終端上輸入man printf函數(shù)可以查看函數(shù)的詳細(xì)使用方法(任何C標(biāo)準(zhǔn)函數(shù)都可以在Linux/Mac平臺(tái)上輸入man+函數(shù)名的方式查看函數(shù)使用方法)。下面是我們使用printf函數(shù)在標(biāo)準(zhǔn)輸出中輸出數(shù)據(jù)的代碼。

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);

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

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

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

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

04

結(jié)語

后面講解C語言知識(shí)時(shí)我會(huì)穿插有Linux相關(guān)知識(shí),講解C語言不能僅僅停留在語法層面。據(jù)我的觀察,很多人學(xué)習(xí)了C語言語法后很迷茫,不知道C語言能做什么,根本原因就是你沒有了解某個(gè)平臺(tái)的系統(tǒng)編程API。Linux是一個(gè)開源操作系統(tǒng),結(jié)合Linux學(xué)習(xí)C語言將會(huì)更加有趣,在Linux上進(jìn)行C語言開發(fā)絕對(duì)是最佳選擇。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11351

    瀏覽量

    210494
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137820
  • File
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    14386
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    63006
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4834

    瀏覽量

    69115

原文標(biāo)題:C語言入門基礎(chǔ)之輸入和輸出

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TMS320C645x DSP通用輸入/輸出(GPIO)用戶指南

    電子發(fā)燒友網(wǎng)站提供《TMS320C645x DSP通用輸入/輸出(GPIO)用戶指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-17 15:56 ?0次下載
    TMS320<b class='flag-5'>C</b>645x DSP通用<b class='flag-5'>輸入</b>/<b class='flag-5'>輸出</b>(GPIO)用戶指南

    C語言與Java語言的對(duì)比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。以下將從語法特性、內(nèi)存管理、跨平臺(tái)性、性能、應(yīng)用領(lǐng)域等多個(gè)方面對(duì)C
    的頭像 發(fā)表于 10-29 17:31 ?454次閱讀

    FPGA編程語言入門教程

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

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

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

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

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

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

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

    誤差放大器的輸入輸出關(guān)系

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

    PLC運(yùn)動(dòng)控制中的輸入輸出設(shè)備

    在PLC(可編程邏輯控制器)運(yùn)動(dòng)控制系統(tǒng)中,輸入輸出設(shè)備扮演著至關(guān)重要的角色。這些設(shè)備不僅負(fù)責(zé)將外部信號(hào)傳遞給PLC,還負(fù)責(zé)將PLC的處理結(jié)果輸出到外部執(zhí)行機(jī)構(gòu),從而實(shí)現(xiàn)對(duì)機(jī)械設(shè)備運(yùn)動(dòng)的精確控制。以下是對(duì)PLC運(yùn)動(dòng)控制中輸入輸出
    的頭像 發(fā)表于 09-03 10:52 ?1086次閱讀

    PLC輸入端口和輸出端口的工作原理

    內(nèi)部邏輯運(yùn)算后,再通過輸出端口控制外部設(shè)備。因此,了解PLC輸入端口和輸出端口的工作原理對(duì)于理解和應(yīng)用PLC系統(tǒng)至關(guān)重要。本文將詳細(xì)解析PLC輸入
    的頭像 發(fā)表于 06-19 14:11 ?3186次閱讀

    PLC編程語言C語言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們?cè)诙鄠€(gè)方面存在顯著的區(qū)別。本文將從多個(gè)維度深入探討PLC編程
    的頭像 發(fā)表于 06-14 17:11 ?3286次閱讀

    CubeAI-7.0.0生成的C語言代碼,神經(jīng)網(wǎng)絡(luò)運(yùn)行函數(shù)是哪個(gè),輸入輸出分別是哪個(gè)變量啊?

    CubeAI-7.0.0生成的C語言代碼,神經(jīng)網(wǎng)絡(luò)運(yùn)行函數(shù)是哪個(gè),輸入輸出分別是哪個(gè)變量???求教大佬,之前5.1.2還能看懂,現(xiàn)在7.0.0看不懂了。
    發(fā)表于 04-01 07:30

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

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

    C語言中的錯(cuò)誤處理機(jī)制解析

    C 語言不提供對(duì)錯(cuò)誤處理的直接支持,但是作為一種系統(tǒng)編程語言,它以返回值的形式允許您訪問底層數(shù)據(jù)。
    的頭像 發(fā)表于 02-26 11:19 ?573次閱讀

    C語言中的頭文件

    #include 指令會(huì)指示 C 預(yù)處理器瀏覽指定的文件作為輸入。預(yù)處理器的輸出包含了已經(jīng)生成的輸出,被引用文件生成的輸出以及 #inclu
    發(fā)表于 02-23 14:06 ?526次閱讀

    ArkTS語言基礎(chǔ)類庫-解析

    被設(shè)計(jì)用來傳輸和存儲(chǔ)數(shù)據(jù),是一種可擴(kuò)展標(biāo)記語言。語言基礎(chǔ)類庫提供了[XML生成、解析與轉(zhuǎn)換]的能力。 URL、URI構(gòu)造和解析能力:其中[URI]是統(tǒng)一資源標(biāo)識(shí)符,可以唯一標(biāo)識(shí)一個(gè)資源
    發(fā)表于 02-20 16:44