數據類型、小數位問題、scanf()函數


C語言里面的數據類型共四大類:

基本類型 :

  1. 整型類型:基本整型(int)、短整型(short int)、長整型(long int) 、雙長整型(long long int)、字符型(char)、布爾型(bool)
  2. 浮點類型:單精度浮點型(float) 、雙精度浮點型(double) 、復數浮點型(float_complex,bouble_complex,long long_compled)

枚舉類型 : 枚舉類型(enum)

空類型   :空類型(void)

派生類型 指針類型(*) 、數組類型([ ]) 、結構體類型(struct) 、共用體類型 (union) 、函數類型

 其中基本類型枚舉類型變量的值都是數值,所以統稱為算術類型 (arithmetic type)。

算數類型指針類型統稱為純量類型(scalar type),因為其變量的值是以數字來表示的。

數組類型結構體類型統稱為組合類型(aggregate type),共用體類型不屬於組合類型,因為在同一時間內只有一個成員具有值。

函數類型用來定義函數,描述一個函數的接口,包括函數返回值的數據類型和參數類型。

C語言控制小數位數的方法

答:是通過控制格式說明符來控制的。

#include<stdio.h>
int main()
{
    const double pi = 3.1415926;  //雙精度長度可以到16位
    printf("%lf",pi);  //輸出的結果是3.141593,系統自動四舍五入了,不指定輸出的小數位時系統默認輸出小數位為6位
    putchar('\n');  //單字符輸出
    printf("%.8lf",pi);  //指定小數位為8位,輸出結果是:3.14159260,可預測
    return 0;
}

 int scanf( const char *format [, argument]... );

scanf()函數的作用是從標准的輸入流中讀取數據,並將讀取到的數據保存到指定的變量中。

其格式為:

int scanf( const char *format [, argument]... );

其中,參數format指定了讀取數據的方式;argument是一個參數列表,其類型是變量的地址,scanf()函數讀取到的數據就保存到這些參數中。scanf()函數的返回值是保存數據的參數的數量,即對參數列表argument中多少個參數進行了賦值。

format參數是一個字符串:該字符串包含了格式說明符、空白字符和其他字符。

格式說明符也就是format參數中的百分號%。當scanf()函數遇到其參數中的格式說明符時,就開始從數據流中讀取數據,並將數據轉化為格式說明符指定的格式,保存到參數列表中的相應參數中。例如:

...
int i;
scanf("%d", &i);
...

在掃描標准輸入函數時首先掃描到的是格式說明符%,當掃到這個時,程序就停止在這里等待用戶輸入數據(一個%占一個字符),當用戶輸入數據時,數據是被存儲在后面&后面的變量里面,&是取地址符號。

空白字符指的是空格符(' ')、tab符('\t')和新行符('\n')。

當scanf()函數遇到空白字符時,該函數會讀取輸入數據流中連續的空白字符,但是不會存儲這些字符,直到讀取到輸入數據流中非空白字符為止。

format格式與輸入流匹配

例如:

...
int i;
char ch;
scanf("%d %c", &i, &ch);  //兩個格式說明符中間有一個空格
...

 此時在控制台輸入窗口中輸入“123 a”。對於scanf()函數的format參數,首先第一個格式說明符%使得scanf()函數從數據流中讀取“123”並且將其轉換為整形保存到變量i中;之后對於format參數中的空格符,scanf()函數從輸入數據流中讀取連續的空白字符,但是並不將該字符保存到參數列表中的參數;最后第二個格式說明符%使得scanf()函數從數據流中讀取“a”,並將其轉換為字符類型保存到變量ch中。

 當format包含空白字符而輸入流數據中不包含空白字符時,即

scanf("%d %c", &i, &ch);

而此時在控制台輸入窗口中輸入“123a”,scanf()函數的format參數的第一個格式說明符%使得scanf()函數從數據流中讀取數據,需要注意的時,雖然此時輸入的數據中不包含空白字符,但是scanf()函數無法將其中的“a”轉換為整形,因此第一個格式說明符%使得scanf()函數從數據流中讀取的數據為“123”,轉換為整形后保存到變量i中;之后,在format參數中是一個空白字符,在上面的format格式與輸入流匹配”中提到,空白字符使得scanf()函數讀取輸入數據流中連續的空白字符,但是此時輸入數據中不包含空白字符,因此format參數中的空白字符並沒有起作用,即此時scanf()函數並沒有讀取輸入數據流中的數據;最后,format參數的第二個格式說明符%使得scanf()函數從數據流中讀取數據“a”,並將其轉換為字符類型保存到ch中。此時,i的值是123,而ch的值是’a’。

當format不包含空白字符而輸入流包含時

當format包含不空白字符而輸入流數據中包含空白字符時,即

scanf("%d%c", &i, &ch);

而此時在控制台輸入窗口中輸入“123 a”,scanf()函數的format參數的第一個格式說明符%使得scanf()函數從數據流中讀取數據“123”,之后format參數的第二個格式說明符%使得scanf()函數從數據流中讀取數據,需要注意的是,此時讀取到的數據不是“a”而是空格符。因此,i的值是123,而ch的值是' '。

其他字符

format參數中的其他字符指的是除了空白字符和格式說明符之外的其他字符。format參數中的其他字符要與輸入數據流中的字符匹配,例如:

scanf(“%d,%c”, &i, &ch);

此時,在控制台輸入窗口中輸入“123,a”,才能保證i的值是123,ch的值是’a’。如果format參數中的其他字符與輸入數據流中的字符不匹配,則scanf()函數停止讀取數據。

如果在控制台中輸入“123a”,此時i的值是123,而ch的值是調用scanf()函數之前的值。

星號符號

格式說明符%之后除了跟指定數據類型的字符之外,還可以跟星號*。例如

%*d

scanf()函數遇到該符號時,只是從數據流中讀取數據,但是並不把讀取到的數據存儲到參數列表中的參數。例如

scanf("%*d %d%c", &i, &ch);

在控制台輸入窗口中輸入“123 456a”,此時,i的值是456,而ch的值是’a’。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM