1. 程式人生 > >輸出與輸出:putchar() getchar() printf() scanf() puts() gets() sscanf()

輸出與輸出:putchar() getchar() printf() scanf() puts() gets() sscanf()

輸入 har 斜杠 但我 普通 不同 結果 網上 __int64

C語言中基本的輸入輸出函數有:
putchar ():把變量中的一個字符常量輸出到顯示器屏幕上;
getchar ();從鍵盤上輸入一個字符常量,此常量就是該函數的值;
printf ();把鍵盤中的各類數據,加以格式控制輸出到顯示器屏幕上;
scanf ();從鍵盤上輸入各類數據,並存放到程序變量中;
puts ():把數組變量中的一個字符串常量輸出到顯示器屏幕上;
gets ():從鍵盤上輸入一個字符串常量並放到程序的數組中.
sscanf(); 從一個字符串中提取各類數據。
putchar() 和 getchar() 顧名思議就是從輸入流中獲取一個字符和輸出一個字符,比較簡單,不再多講。
例子如下:
char c = getchar();
putchar?;
格式化輸入輸出scanf()和printf()是最有用的,所以重點講一下。
printf():
一般形式:
printf("格式控制".輸出列表);
eg : printf("a=%d,b=%f,c=%c/n",a,b,c);
1;格式控制.
格式控制是用雙引號括起來的字符串,也稱"轉換控制字符串",它包含以下兩部分信息.
格式說明:由"%"和格式字符組成,如%d,%f,%c,他的作用是把輸出數據轉換為指定格式輸出,格式的說明總是由"%"字符開始的.

普通字符:需要原樣輸出的字符,或者是一些有特殊含義的字符,如/n,/t。
2;輸出列表
就是需要輸出的一些數據,也可以是表達式,如果在函數中需要輸出多個變量或表達式,則要用逗號隔開.
一些特殊字符的輸出:
單引號,雙引號,和反斜杠的輸出在前面加轉義字符”/”
如:”/’” , “/”” , “//”
%的輸出用兩個連在一起的%%,即printf(“%%”);

常用的格式說明如下:
格式字符
d 以十進制形式輸出帶符號整數(正數不輸出符號)
o 以八進制形式輸出無符號整數(不輸出前綴O)
x 以十六進制形式輸出無符號整數(不輸出前綴OX)
u 以十進制形式輸出無符號整數
f 以小數形式輸出單精度實數
lf以小數形式輸出雙精度實數
e 以指數形式輸出單、雙精度實數
g 以%f%e中較短的輸出寬度輸出單、雙精度實數
c 輸出單個字符
s 輸出字符串
這裏強調一下:網上很多文章都說f 和lf是一樣的,即不管單精度,雙精度浮點數,都可以用f, 但我在POJ上做過測試,輸出Double時用f確實也可以 ,但讀入時,用f就報WA,所以大家如果對Double進行讀寫的話,都用lf吧。
說到Double,再啰嗦一句,建議大家要用到浮點數時都用Double,不要用float,因為在很多情況下,float精度不夠會導致WA。
特殊:
對64位整數的輸入輸出,在POJ上的C++環境下(即VC),64位整數是:
__int64 (註意int前面是兩個下劃線)
輸入輸出格式為”%I64d”.
在G++環境下(即Dev C++) 64位整數是
long long
輸入輸出格式為”%lld”.

輸出寬度
  用十進制整數來表示輸出的最少位數。 註意若實際位數多於定義的寬度,則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0。
精度
  精度格式符以“.”開頭,後跟十進制整數。意義是:如果輸出數字,則表示小數的位數;如果輸出的是字符, 則表示輸出字符的個數;若實際位數大於所定義的精度數,則截去超過的部分。
標誌格式字符
- 結果左對齊,右邊填空格
+ 輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
例如:
double c=24212345.24232;
printf(“%020.4”); 表示輸出精確到小數點後4位,輸出占20位,若有空余的位補0.
scanf:
scanf的很多用法都是和printf對應的,故不再贅述。
說一下scanf一個特別好用的地方,就是可以濾去一些不想要的東西。
舉例說明如下:
比如輸入為日期 yyyy-mm-dd,就可以這樣寫:
int year,moth,day;
scanf(“%d-%d-%d”,&year,&moth,&day);
再比如:
scanf("%3d %*3d %2d",&m,&n); 輸入113 118 69回車(系統將113賦予m,將69賦予n,因為*號表示跳過它相應的數據所以118不賦予任何變量)
puts()用的不多,且基本都能用printf()代替,故不再多說。
gets()是從輸入流中獲取一行字符串放入字符數組中:
char in[100];
gets(in);
大家可能最容易出錯的地方就是字符串的輸入,所以強調一下:
能進行字符,字符串輸入的有:
getchar(), scanf(“%c”); scanf(“%s”), gets()
其中getchar() 和 scanf(“%c”)的功能是一樣的。
需要註意的是,這兩個函數讀入的是輸入流中當前位置的字符,
比如:
scanf(“%d”,&n);
c = getchar();
假設輸入 67/ (假設“/”代表回車),則第一個scanf讀入一個整數67後,當前輸入流的位置是67之後,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘/n’。
同樣,gets()也是從當前位置讀入一行字符串。
比如:
scanf(“%d”,&n);
gets(str);
此時讀入字符數組中的字符串就是“/n” 了
所以通常在用scanf讀入一個非字符串的類型之後,如果要讀入字符,或字符數組,都用一個額外的getchar()把回車符讀掉,若後面跟的不止一個回車符,可能還有多余的空格的話,就用gets()讀掉。
和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和制表符的。並且以空格,回車和制表符作為字符串結束的標誌。
經常會有這樣的題,輸入第一行是一個整數,接下來每行的第一個是一個字符,用來表示某種操作,後面再跟一些數據,比如:
4
A 100 2
B 23
A 23 89
B 34
像這種輸入就需要小心,讀入字符時不要讀成回車符。
為了防止意外,我一般是這樣處理這類輸入的:
char model[2];
Scanf(“%d”,&n);
for(…,…,…){
scanf(“%s”,model);
if(model[0] == ‘A’){
}
else{
}
}
sscanf():
sscanf()經常用來分解字符串,功能非常強大,但很多功能都需要正則表達式的知識,所以就介紹一下最簡單的幾種用法,大家如果想了解更多的話,自己去網上找吧。
1.
char str[100],str1[100],str2[100];
gets(str);
sscanf(str,”%s%s”,str1,str2);
將讀入的一整行字符串按空格,制表符或回車符分割成兩個字符串。
2
取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
sscanf("123456 ", "%4s", str);

輸出與輸出:putchar() getchar() printf() scanf() puts() gets() sscanf()