程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【ACM】【Pro.1000】A + B Problem ACM之旅開始啦,pro.1000acm

【ACM】【Pro.1000】A + B Problem ACM之旅開始啦,pro.1000acm

編輯:關於C語言

【ACM】【Pro.1000】A + B Problem ACM之旅開始啦,pro.1000acm


A + B Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 446348    Accepted Submission(s): 141167

Link:http://acm.hdu.edu.cn/showproblem.php?pid=1000

 


#include <stdio.h> main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) printf("%d\n",a+b); return 0; }

第一次做ACM,遇到問題。在網上搜索之後,才得以解決。

此處引用一篇博文,介紹C語言中‘EOF’是個什麼東東:

原文鏈接:http://www.kuqin.com/language/20111112/314745.html

C語言 EOF是什麼?

我學習C語言的時候,遇到的一個問題就是EOF。

它是end of file的縮寫,表示"文字流"(stream)的結尾。這裡的"文字流",可以是文件(file),也可以是標准輸入(stdin)。

比如,下面這段代碼就表示,如果不是文件結尾,就把文件的內容復制到屏幕上。

  int c;

  while ((c = fgetc(fp)) != EOF) {

    putchar (c);

  }

很自然地,我就以為,每個文件的結尾處,有一個叫做EOF的特殊字符,讀取到這個字符,操作系統就認為文件結束了。

但是,後來我發現,EOF不是特殊字符,而是一個定義在頭文件stdio.h的常量,一般等於-1。

  #define EOF (-1)

於是,我就困惑了。

如果EOF是一個特殊字符,那麼假定每個文本文件的結尾都有一個EOF(也就是-1),還是可以做到的,因為文本對應的ASCII碼都是正值,不可能有負值。但是,二進制文件怎麼辦呢?怎麼處理文件內部包含的-1呢?

這個問題讓我想了很久,後來查了資料才知道,在Linux系統之中,EOF根本不是一個字符,而是當系統讀取到文件結尾,所返回的一個信號值(也就是-1)。至於系統怎麼知道文件的結尾,資料上說是通過比較文件的長度。

所以,處理文件可以寫成下面這樣:

  int c;

  while ((c = fgetc(fp)) != EOF) {

    do something

  }

這樣寫有一個問題。fgetc()不僅是遇到文件結尾時返回EOF,而且當發生錯誤時,也會返回EOF。因此,C語言又提供了feof()函數,用來保證確實是到了文件結尾。上面的代碼feof()版本的寫法就是:

  int c;

  while (!feof(fp)) {

    c = fgetc(fp);

    do something;

  }

但是,這樣寫也有問題。fgetc()讀取文件的最後一個字符以後,C語言的feof()函數依然返回0,表明沒有到達文件結尾;只有當fgetc()向後再讀取一個字符(即越過最後一個字符),feof()才會返回一個非零值,表示到達文件結尾。

所以,按照上面這樣寫法,如果一個文件含有n個字符,那麼while循環的內部操作會運行n+1次。所以,最保險的寫法是像下面這樣:

  int c = fgetc(fp);

  while (c != EOF) {

    do something;

    c = fgetc(fp);

  }

  if (feof(fp)) {

    printf("\n End of file reached.");

  } else {

    printf("\n Something went wrong.");

  }

除了表示文件結尾,EOF還可以表示標准輸入的結尾。

  int c;

  while ((c = getchar()) != EOF) {

    putchar(c);

  }

但是,標准輸入與文件不一樣,無法事先知道輸入的長度,必須手動輸入一個字符,表示到達EOF。

Linux中,在新的一行的開頭,按下Ctrl-D,就代表EOF(如果在一行的中間按下Ctrl-D,則表示輸出"標准輸入"的緩存區,所以這時必須按兩次Ctrl-D);Windows中,Ctrl-Z表示EOF。(順便提一句,Linux中按下Ctrl-Z,表示將該進程中斷,在後台掛起,用fg命令可以重新切回到前台;按下Ctrl-C表示終止該進程。)

那麼,如果真的想輸入Ctrl-D怎麼辦?這時必須先按下Ctrl-V,然後就可以輸入Ctrl-D,系統就不會認為這是EOF信號。Ctrl-V表示按"字面含義"解讀下一個輸入,要是想按"字面含義"輸入Ctrl-V,連續輸入兩次就行了。

(完)


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved