天天看點

問題 1000: [競賽入門]簡單的a+b scanf 和 cin中的特殊用法

題目很簡單但是有一個挺好的知識點

問題 1000: [競賽入門]簡單的a+b

時間限制: 1Sec 記憶體限制: 128MB 送出: 43301 解決: 20493

題目描述

輸入兩個整數a和b,計算a+b的和

注意此題是多組測試資料

輸入

輸入兩個整數A和B

範圍不超過2^10

輸出

求A+B

樣例輸入

1 1
10 20
           

樣例輸出

2
30
           

提示

訓練場入門:藍橋杯ACM基本輸入輸出教程

題目是非常簡單的,但是有一個比較頭痛的事情就是輸入的内容是不确定的。對于不确定的輸入内容如何通過輸入函數解決呢

首先通過學習發現對于這些輸入内容不确定的題目主要根據scanf函數的傳回值來确定的。

經過分析,發現scanf函數傳回值和輸入的内容有關,如scanf("%d%d",&a,&b)輸入數值後傳回的數值是2,由此延伸出一個出來方法一

# include<stdio.h>

int main(){

    int a=0 , b =0 ; 

    while(scanf("%d%d",&a,&b)==2)//當判斷輸入的内容是兩個整數的時候進行運算 

    {

        printf("%d\n",a+b);

    }    

    return 0 ;

與此同時偷師了一波,偷師内容:

scanf()函數傳回值分為3種:

(1)傳回正整數。表示正确輸入參數的個數。

(2)傳回整數0。表示使用者的輸入不比對,無法正确輸入任何值。

(3)傳回-1。表示輸入流已經結束。在Windows下,使用者按下CTRL+Z(會看到一個^Z字元)再按下回車(可能需要重複多次),就表示輸入結束;Linux/Unix下使用CTRL+D表示輸入結束。

(重點,重點,重點!!!!!!!!!!作筆記了!!!!)

關于~的作用解析:

1、在Windows下,使用者按下CTRL+Z(會看到一個^Z字元),會停止輸入流,scanf會傳回-1。

2、-1的補碼為11111111 11111111 11111111 11111111  一共4個位元組。

3、~是C語言中的按位取反,是以~(-1)結果為00000000 00000000 00000000 00000000剛好為整數0的補碼。

4、是以當輸入Ctrl+Z時,scanf會傳回-1,while(~-1)==while(0),0為假,退出while循環。

什麼意思呢其實就是如果不清楚 接收多少内容的情況下,通過使用“while(~scanf(""))”可以完成不确定内容的輸入,如果不知道需要接收多少行資訊的時候,可以參考這個方式。樣例

# include<stdio.h>

int main(){

    char a[1000] , b =0 ; 

    while(~scanf("%s",&a)){//輸入字元串,判斷是否由輸入的内容有的話執行判斷,如果輸入内容結束(ctrl+z停止輸入流,不是回車)将結束循環

        cout<<a<<endl;//循環中的a會被覆寫需要保持的話需要單獨處理

    }   

    return 0 ;

還研究了一下c++的使用方法

# include <iostream>

using namespace std ;

int main(){

    char a[1000] , b =0 ; 

    while(cin>>a){//當輸入流結束的時候結束循環

        cout<<a<<endl;

    }    

    return 0 ;

繼續閱讀