亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Linux C語言編程基本原理與實踐

難度初級
時長 2小時 0分
學習人數
綜合評分9.60
350人評價 查看評價
9.8 內容實用
9.6 簡潔易懂
9.4 邏輯清晰
  • 【錯誤流】 我們將程序進行一些修改,如下: #include <stdio.h> int main() { printf("input the int value i:\n"); int i, j; scanf("%d", &i); printf("input the int value j:\n"); scanf("%d", &j); if(0!=j){ printf("%d/%d=%d\n",i,j,i/j); }else{ fprintf(stderr, "j != 0\n"); return 1; } return 0; } 對程序進行編譯cc main.c,得到./a.out,分別根據提示輸入8和4得到結果“8/4=2”,我們使用命令echo $?,得到0說明程序正常輸入,下面我們來測試一下錯誤流,再次執行程序./a.out,我們輸入8和0,并使用echo $?命令得到返回值為1,則有錯誤流顯示的結果“j != 0”。 我們能否將正確和錯誤的結果分別倒入(寫文件的方式)到不同的文件中去呢?命令我們寫./a.out 1>t.txt 2>f.txt,正確的導入到t.txt中,錯誤的導入到f.txt。同樣地,我們還可以把輸入流加到剛才的命令中去。 根據以上講的,有: 標準輸入流 ==> 鍵盤輸入 標準輸出流 ==> 終端輸出 標準錯誤流 ==> 錯誤輸出 我們再結合通道,就可以寫出有實際意義的命令來。
    查看全部
  • 【編寫使用管道的程序】 我們在文件夾下,c語言做的每個程序都有一個獨立的功能,我們可以將多個小程序使用管道連接到一起。 我們現在寫一個程序avg.c,求任意個數的平均值: #include <stdio.h> int main() { int s, n; scanf("%d,%d", &s, &n); float v = s / n; printf("v = %f\n", v); return 0; } 退出vim進行編譯cc avg.c -o avg.out,我們得到avg.out,我們輸入3000,3。 我們再寫一個統計輸入的程序input.c: #include <stdio.h> int main() { int flag = 1; int i; int count = 0; int s = 0; while(flag){ scanf("%d", &i); if(0==i) break; count++; s+=i; } printf("%d,%d\n",s,count); return 0; } 我們對這個函數進行編譯cc input.c -o input.out,我們輸入3000 2000 0,輸出總工資5000和人數2。 我們不妨使用以上兩個程序結合起來,將所有數據進行統計input.out,之后通過管道經過avg.out計算平均值,命令可以寫為./input.out | ./avg.out,然后進行輸入,輸入完成我們便得到了對應的平均工資。 以上就是通過管道,將兩個小程序連接起來得到更復雜的程序的過程。
    查看全部
  • 【管道原理及應用】 Linux系統自帶的小工具如何使用,其實這些小工具就是一個應用程序,比方說ls /查看根目錄,比方我們要查找某個目錄下有多少個文件名包含“ab”,我們可以寫ls /etc/ | grep ab,其中這個豎線就是管道的意思,grep是從文本文檔中查找指定的行(其實可用于文本搜索)。 將我們前一個程序執行輸出流,通過管道得到我們需要的內容。通過管道我們就可以使用很多自動化的方法,管道的應用還有很多。 例如,ps可以查看當前的進程,我們想查看我們當前操作系統是否開啟ssh進程,我們可以使用命令ps -e | grep ssh,查看所有進程中是否包含ssh服務的,若有我們便可以進行連接。
    查看全部
  • 1.cp 拷貝
    查看全部
  • 【main函數中的參數】 我們使用命令cp main.c main2,c,復制并創建一個main2.c文件: #include <stdio.h> int main(int argv, char* argv[]) { print("argv is %d \n", argv); return 0; } 我們在使用命令cc main2.c -o m2.out進行編譯,執行./m2.out命令,有“argv is 1” 對于ls我們可以在此命令上加參數,例如: 顯示更多的文件信息:ls -l 顯示隱藏的文件信息:ls -a 那么,同理,我們也可以對./m2.out這個可執行文件加參數。分別執行如下命令并觀察輸出: ./m2.out,輸出為“argv is 1” ./m2.out -l,輸出為“argv is 2” ./m2.out -l -a,輸出為“argv is 3” 我們可以觀察到,加不同個數的參數,argv返回對應參數的值,我們不僅要知道幾個參數,我們還可以知道每個參數是什么,我們將程序進行修改,加上如下一段代碼: int i; for(i=0; i<argv; i++) {//在vs或者xcode里,可以在for內聲明int i,但是在c98下不能這么寫,會報錯,是因為版本的問題 printf("argc[%d] is %s\n", i, argc[i]); } 這時,我們再編譯gcc main2.c -o m3.out,運行./m3.out -l -a asadf sdfd有如下顯示: argv is 5 argc[0] is ./m2.out argc[1] is -l argc[2] is -a argc[3] is asadf argc[4] is sdfd 以上內容和linux,unix聯系非常緊密,尤其是在linu嵌入式,linux小工具的開發,以及linux的網絡編程,都是很重要的內容。
    查看全部
  • 【輸入流重定向】 我們可以創建一個文件vi input,txt,內容如下: 6 8 我們再次執行./a,out < input.txt,不存在追加模式,所以我們用單箭頭<,我們可以將要輸入的內容全部在input.txt中準備好,命令執行后,我們便在終端上可以看到結果。
    查看全部
  • 【輸入輸出流以及錯誤流的重定向機制】 Linux幾乎可以用于任何領域,這里我們不得不提出linux的通道,管道起到了很重要的作用,不同應用程序之間要配合使用,就需要用到管道。 我們這里先給出一個例子main.c,主要介紹輸入流,輸出流和錯誤流的重定向機制,對于管道的理解會比較容易些。 #include <stdio.h> int main() { printf("input the int value i:\n"); \\printf其實對fprintf的封裝,是從標準輸出流(即stdout)來輸出這個過程 scanf("%d", &i); //默認輸入流是鍵盤 printf("input the int value j:\n"); scanf("%d", &j); printf("i+j=%d\n", i+j); } 執行命令編譯cc main.c,得到a.out,運行a.out,我們分別輸入3和5輸入到終端。我們標準輸出流是1,輸出入是0。我們可以使用命令./a.out 1>> a.txt,其中>>符號(不寫參數就是輸出流),之前默認輸出流是終端,現在我們則改為輸出到a.txt中,我們執行命令后,分別輸入3回車后再輸入5。再使用命令cat a.txt,我們可以看到我們已經輸出到文件里的內容。 我們再次執行./a.out >> a.txt,我們再次輸入參數,完成后我們再次使用cat來查看a.txt文件里的內容,發現之前的內容還在,新的輸出內容追加到了后面。 再舉一個重定向的例子,我們使用命令ls /etc >> etc.txt,我們將ls目錄下的內容輸入到了etc.txt文件中;但我們如若改重定向符號想覆蓋掉之前的內容,可以把雙箭頭>>改為單箭頭>,則文件中先前的內容就會被覆蓋掉。
    查看全部
  • 【標準輸入流,輸出流,錯誤流】 現在有cio.c文件: #include <stdio.h> //標準輸入輸出 /* stdin stdout stderr */ int main() { printf("hello world!\n"); //輸出功能由標準輸出流完成,printf是系統封裝后的 int a; scanf("%d", &a); //標準輸入流,錯誤流是系統出錯的時候的 printf("input value is : %d\n", a); return 0; } 在我們輸入a.out時,當程序執行的一瞬間,系統給程序提供了一個進程,當程序啟動時,系統也提供給程序一系列的指針。linux將所有的外設(攝像頭,打印機云云)也罷等等,都視為文件。當啟動應用程序時候,也當文件操作,會產生三個文件(stdin,stdout,stderr,即標準輸入,輸出,錯誤流)。 默認情況下,輸入流就是鍵盤,stdout也可以切換默認為顯示器,我們可以切換為網卡或者打印機,錯誤流同理。我們在啟動文件的時候,都會產生這三個文件。 printf函數是一個封裝過的函數: printf("Please input the value a:\n"); fprintf(stdout, "please input the value a:\n"); 因為stdout默認是顯示器,上兩句就是等價的,printf其實就是fprintf封裝后得到的。 同樣,我們也有scanf和fscanf的關系(下面兩句是等價的): scanf("%d", &a); fscanf(stdin, "%d", &a); 同樣,我們也有錯誤流: if(a<0){ fprintf(stderr, "the value must > 0\n"); return 1; } return 0; 如何讓程序知道出錯了,我們通過返回值1和0體現,再次編譯cc cio.c -o a2.out,我們運行a2.out,輸入2則正常執行,當輸入-1,則有我們對應的提示,即錯誤流就發揮作用了。 其實Linux一個很大的系統,就是由這些類似的小工具完成的,當等于0是為正確,錯的話為其他值。當然,標準的輸入流,輸出流,以及錯誤流也可以重定向。
    查看全部
  • 【關于return 0和命令連接符&&】 我們分別對main.c程序進行修改(return后一個為0,一個為101),分別生成main.o和main2.o文件。 return 0:gcc main.c -o main.o return 101:gcc main.c -o main2.o 之后我們使用命令./main.o && ls和./main2.o && ls,發現前者即返回hello world!同時顯示了當前的目錄(其中ls為顯示當前目錄命令),但是后者卻只返回hello world!,即&&符號后面的語句沒有執行。我們兩個命令執行后,分別執行echo $?命令,前者返回0,后者返回101。 我們知道&&是and操作,需要前一句執行正確才能執行and(即&&)后面的內容。對于上面的那個例子,我們不禁可以推斷出,0在linux下即為(程序執行)正確的意思,因此才會執行&&后面的ls命令。
    查看全部
  • 【更深入了解c語言在linux下的交互】 建立一個main.c文件 #include <stdio.h> int main(int argv, char* argc[]) { printf("hello world!\n"); return 0; } 我們使用命令 gcc main.c -o main.out && ./main.out linux通過&&符號將兩個指令作為一個指令輸出了,但是linux是如何確定第一條指令是否正確輸出了呢? 我們再次使用./main.out,然后可以使用命令echo $?,若返回0則說明程序正常,但是若為別的數字則說明程序執行失敗了,返回的是一個錯誤碼(好比windows下藍屏了,就會返回一個錯誤碼)。 返回正確則會返回0,是因為我們的程序里面最后寫的是return 0,但當我們將這個return 0改為reutrn 101后,我們再使用指令echo $?,發現返回的是101。
    查看全部
  • 假設有很多.c以及.o文件的時候,我們就需要gcc后面跟一串.c文件等等,那么我們是否有很方便的命令來提高效率呢? make工具就可以很清晰和快速的將文件進行整理,make內部使用了gcc。 首先我們檢查一個我們是否安裝了make工具(使用命令 make -v,若安裝則顯示安裝信息,版本號碼,若未安裝,我們使用命令sudo apt-get install make)。 我們約定一個文件makefile來進行我們之前寫過的文件進行配置。 makefile文件中可以寫注釋,以井號開頭。 hello.out是我們的目標文件,但其中需要max.o,min.o,hello.c這三個文件,我們在makefile寫下: # this is make file。注意 hello.out:max.o min.o hello.c gcc max.o min.o hello.c # 同時我們寫出max.o的文件來源 max.o:max.c gcc -c max.c min.o:min.c gcc -c min.c 刪除以o為后綴的文件:rm *.o 最上面的文件是我們最終需要的文件hello.out,同時它是由max.o,min.o,hello.c,同時我們再給出這三個文件鎖依賴的文件(其實就是遞歸),找到各自的生成的源頭文件。若最后我們沒有在gcc中指定輸出名稱,則最后使用make命令(也就是直接命令make回車),就生成a.out文件,若要指定生成的文件名,我們就可以使用修改Makefile文件內的代碼(改為gcc max.o min.o hello.c -o hello.out)。 此外,還需要注意的是,在Makefile文件中,我們gcc命令前需要有6個空格(即一個TAB鍵),若不是6個空格,則在使用make命令時,則會報錯導致無法生成out文件等。
    查看全部
  • 如果是別人提供的o文件,我們無從知道該o文件原本對應的c文件的函數輸入輸出是什么(cat max.o,我們無法看到文件內容,因為是機器碼),對此,在我們建立o文件的時候,我們可以(模仿stdlib.h的形式)同時寫一個h文件。 例如,我們先對max.c文件使用gcc命令生成max.o文件,然后創建一個max.h文件(vim max.h),然后在這個文件里寫上int max(int a, int b);,同時在我們的主函數文件main.c中加上#include "max.h";(別人在使用我們寫過的max函數的時候,即便不知道函數執行的具體內容但能看到這個函數需要什么樣的傳遞參數和返回值類型)。在編譯的時候,我們使用命令 gcc max.o max.h main.c。
    查看全部
  • 我們可以將max.c和min.c分別用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)編譯成max.o和min.o,我們平時可以將平時很少改動的函數編譯成靜態庫,提高效率,需要編譯時,我們直接gcc max.o max.o main.c即可。我們可以將max.c和min.c分別用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)編譯成max.o和min.o,我們平時可以將平時很少改動的函數編譯成靜態庫,提高效率,需要編譯時,我們直接gcc max.o max.o main.c即可。
    查看全部
  • 拷貝命令:cp max.c min,c,將文件max.c拷貝一份為min.c 我們可以將max.c和min.c分別用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)編譯成max.o和min.o,我們平時可以將平時很少改動的函數編譯成靜態庫,提高效率,需要編譯時,我們直接gcc max.o max.o main.c即可。
    查看全部
  • 返回到上面的vim分欄:Ctrl+w+↑ 9dd(代碼占九行,剪切代碼) 函數黏貼p 退出:wqa(a即所有,所有文件都退出并保存) 兩個文件編譯:gcc max.c hello.c -o main.out -o后面是輸出文件的名稱 我們應該在程序#include <stdio.h>下面聲明包含max函數的文件(加上#include "max.c",這句相當于將max.c文件復制黏貼進hello.c文件中),這時,我們就可以不需要編譯兩個文件,只需gcc hello.c即可得到輸出文件。
    查看全部

舉報

0/150
提交
取消
課程須知
本課程為C語言中級課程 學習本課程需要了解C語言以下基本語法:變量、常量、順序、循環、分支、函數等。
老師告訴你能學到什么?
如何在真正的商業環境(Linux)下編寫C語言程序 如何編譯一個項目以及makefile如何編寫 C語言真正的本領(制作小工具) 多個c語言小工具如何構成強大的軟件系統

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!