1. 程式人生 > >C語言輸入多組資料------“~”與 “EOF”的抉擇

C語言輸入多組資料------“~”與 “EOF”的抉擇

while(~scanf("%d",&A))

通過這樣這樣也可以獲取多組資料

~按位取反運算子,屬於單目運算子的一種

自己昨天寫的第一篇文章中小小地記錄了一下用EOF如何輸入多組資料
EOF,C語言輸入多組資料

我們也都知道其中while裡面的條件是符合時繼續迴圈

!=EOF

可以看出EOF就大概被定義了一個數值,為-1

EOF—百度百科

概念

在C語言中,或更精確地說成C標準函式庫中表示檔案結束符(end of file)。在while迴圈中以EOF作為檔案結束標誌,這種以EOF作為檔案結束標誌的檔案,必須是文字檔案。在文字檔案中,資料都是以字元的ASCII程式碼值的形式存放。我們知道,ASCII程式碼值的範圍是0~127,不可能出現-1,因此可以用EOF作為檔案結束標誌。

其實可以這樣理解,當scanf成功獲取到值與定義的EOF值-1是相匹配的

關於scanf返回值可以看看這個:
C語言scanf返回值

1.Scanf函式返回值就是讀出的變數個數,如:scanf( “%d %d”, &a, &b ); 如果只有一個整數輸入,返回值是1,如果有兩個整數輸入,返回值是2,如果一個都沒有,則返回值是-1。

2.EOF是一個預定義的常量,等於-1。

這點可能比較難理解,scanf如果取不到值,就返回-1,這個情況是在輸入值的前提條件下,但是我們並沒有給他值,所以跟我們不給他資料,他會一直等著我們輸入,而不是返回-1,這兩個就不矛盾了

弄懂了這個關鍵步驟,文章開頭的也就就能很快的理解了

因為:-1按位取反的值為0,while(0)就不符合條件了,所以跳了出來。

-1是這樣表示的:
-1的絕對值是1,二進位制0000 0001,取反為1111 1110,加1等於1111 1111,所以-1為1111 1111,這個取反當然是0000 0000

作為一個ACMer,這兩種方式很顯然是都可以的,(一般用於多組取值)

但剛才逛論壇找問題答案時也看到了如果是字元的話,可能就不那麼順利,如下:

所以,就看大家自己的喜好

抉擇

ps:最近爐石玩的火熱~

用哪種方式嘍~

相關推薦

C語言輸入資料------“~”EOF”的抉擇

while(~scanf("%d",&A)) 通過這樣這樣也可以獲取多組資料 ~ 是按位取反運算子,屬於單目運算子的一種 自己昨天寫的第一篇文章中小小地記錄了一下用EOF如何輸入多組資料 EOF,C語言輸入多組資料 我們也都知道其中whi

打鐵就女裝(1) C 如何輸入資料

while(~scanf("%d",&A)) ~ 是按位取反運算子,屬於單目運算子 通過這樣這樣也可以獲取多組資料 while(scanf("%d",&A)!=EOF) 這種方式通過檔案結束標誌完成資料的連續輸入 但是這種方法有一個弊端 當輸入為字

C語言輸入值,最大的元素第一個交換,最小的最後一個交換

#include<stdio.h>  //輸入一組值,最大的元素與第一個交換,最小的與最後一個交換void main(){int i,j,k,f[10],max,min,small,big;for(i=0;i<10;i++) scanf("%d",&

c語言cJson數生成解析

scu 長度 c語言 數組 != res bject urn dds 1.生成 json char* CreatJsCustNo( BT_BNF_CUST *p, char *strPaperNO) { cJSON *pJsonArry,*pJsonsub;

關於連續輸入資料的淺談

這裡是本鹹魚的第一篇部落格,由於被一道水題給搞的要死要活的,心態爆炸,於是去問了下大佬鼠,然後知道了不少東西,在這裡記錄一下,先粘下這個水題 再粘上鹹魚我的錯誤程式碼 #include<bits/stdc++.h> using namespace std; int main

ACM連續輸入資料問題

一直對這個不太熟悉,故拿出一些簡單題目進行練習,現在清楚了很多 假設每次要輸入4個數 自己常犯錯誤 用while (true){  在這裡實現輸入4個數並做後續處理  },這個明顯是死迴圈,程式不會結

c語言對一資料隨機排序

2014 神州綠盟暑期實習生筆試題-------程式程式設計第一題:第一種方法:使用自己構造的函式來根據每次的位置資訊返回亂序的數字 /* * * 程式功能:對指定的陣列,進行隨機排序,交換陣列中的資料位置 */ #include <stdio.h>

c語言輸入輸出函式printfscanf的用法格式

一樣多, 各引數之間用","分開, 且順序一一對應, 否則將會出現意想不到的錯誤。         1. 格式化規定符     Turbo C2.0提供的格式化規定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━    符號                  作用 ───────────────

ACM入門------C語言中如何實現資料輸入輸出

在“百度知道”看到的,自己只做相應的筆記整理。 輸入格式:有多個case輸入,直到檔案結束 輸出格式:一行一個結果 Problem Description Your task is to Calculate a + b. Too easy?! Of c

C語言基礎學習基本資料型別-變數的輸出輸入

變數的輸出 變數如何輸入輸出呢?實際上,在這之前你已經使用過輸出語句(printf語句)了,我們可以使用printf來執行輸出。 printf語句的使用方法如下: printf(格式控制字串, 資料1, 資料2, 資料3.......); 格式控制字串用特定的格式說明符代表輸出的資料型別,這裡的資料可以是變

C#語言中數集合的區別(以List集合為例)

類型 添加元素 list 添加 一個 保存 操作方法 適用於 length 數組用於保存固定數量的數據,定長,占用內存少,遍歷速度快; 集合保存的數據數量,可以在程序的執行過程中,不斷發生變化,不定長,占用內存多,遍歷速度慢; 在功能上,數組能實現的所有功能,集合都能實現;

C語言輸入輸出總結

1. scanf輸入: 特點:除%c外,讀取輸入時會跳過非白字元前的所有空白字元,然後一直讀取字元,直到空白字元或正在讀取字元不匹配的字元.(不匹配的會丟入緩衝區.作為下一次輸入接收的字元). 技巧: ①:把*放在%和轉換字元之間時,可以讓scanf()跳過相應輸出項. 比如:sca

C語言--查詢數中出現次數最的元素

次數 最大值 定義 style 取出 ++ main print 存儲 查詢數組中出現次數最多的元素#include <stdio.h> #include <malloc.h> #include <stdlib.h> int max_c

C++輸入資料

動機 程式設計題常用需求,比如輸入兩行資料。 解決思路:使用getline 程式 #include <iostream> #include <vector> #include <string> #include <algorithm> using na

C++從鍵盤輸入資料

遇到很多筆試題不是事先留好的介面寫函式,而需要自己從鍵盤輸入多行資料。 下面是利用C++類從鍵盤獲取資料: #include <iostream> using namespace std; class Node { public: int a;

C++語言程式設計基礎》學習類物件之檔案結構和預編譯命令​​​​​​​

C++程式的一般組織結構: 一個工程可以劃分為多個原始檔,例如: 類宣告檔案(.h檔案) 類實現檔案(.cpp檔案) 類的使用檔案(main()所在的.cpp檔案) 利用工程來組合各個檔案。Point.h class Point { //類的定義 public:

資料輸入和n資料輸入

在新接觸一門語言時,特別是這種抽象的語言,我覺得在入門階段是最難的,可能到現在我也沒有入門吧,我記得剛開學時打oj,困擾我許久的問題是多組資料的輸入,還有n組資料的輸入。    下面是輸入不定組資料,直到檔案終止,即EOF(end of files),EOF也是-1,而

C語言實現(摘自資料結構演算法分析 C語言描述)

一、概述: 棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。對棧的基本操作有Push(進棧)和Pop(出棧),前者相當於插入,後者則是刪除最後插入的元素。 棧有時又叫做LIFO(後進先出)表。在圖1中描述的模型只象徵著Pus

(一個檔案資料輸入的)韓信點兵問題

韓信點兵問題 網上找到的答案都是隻能輸入一組資料立即給出結果的,這裡是能輸入多組資料然後一次性輸出全部結果的。 描述 相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入包含多組資料,每組資料

輸入字串 方法getline()vector

方法一: 利用getline()函式 getline函式對空白符的處理:不忽略空白符,即把空白符也當成元素儲存到string物件中,讀取字元一直到換行符(回車),讀取終止且丟棄換行符(換行符從輸入流中丟去且不儲存在string物件中) cin函式對空白符的處理:讀取並忽略