1. 程式人生 > 實用技巧 >C連載22-scanf轉換說明中的修飾符

C連載22-scanf轉換說明中的修飾符

一、scanf()轉換說明中的修飾符

轉換說明 含義
* 抑制賦值,示例:“%*d"
數字 最大欄位寬度,輸入達到最大欄位寬度處,或者第一次遇到空白字元為止,示例:"%10s"
hh 把整數作為signed char 或者 unsigned char 型別讀取
ll 把整數作為long long或者unsigned long long型別讀取(C99),示例:"%lld"、"%llu"
h、l或者L "%hd"和"%hi”表明把對應的值儲存為short int型別;“%ho”、“%hx"和”%hu"表明把對應的值儲存為unsigned short int型別;"%ld"和"%li"表明把對應的值儲存為long型別;"%lo"、“lx”和“%lu”表明把對應的值儲存為unsigned long型別;“%le"、”%lf“和"%lg"表明把對應的值儲存為double型別;在e、f和g前面使用L而不是l,表明把對應的值被儲存為long double型別,如果沒有修飾符,d、i、o和x表明對應的值被儲存為int型別,f和g表明把對應的值儲存為float型別
j 在整形轉換說明後面時,表明使用intmax_t或者uintmax_t型別(C99)示例:"%jd"、"%ju"
z 在整形轉換說明後面時,表明使用sizeof的返回型別,示例:"%zd"、”%zo"
t 在整形轉換說明後面時,表明使用表示兩個指標差值的型別 ,示例:"%td"、"%tx"
  • scanf()函式每次讀取一個字元,跳過所有的空白字元,直到遇到第一個非空白字元才開始讀取。
  • 如果使用欄位寬度,scanf()在欄位末尾或者第一個空白字元的時候停止讀取,無法利用欄位寬度讓只有一個%s的scanf()讀取多個單詞,最後要注意一點:當scanf()把字串放進指定的陣列的時候,它會在字元序列的末尾新增上'\0',讓陣列中的內容成為一個C字串。

二、格式字串中的普通字元

  • scanf()函式中允許把普通字元放到格式字串中,除了空格字元外的普通字元必須與輸入字串嚴格匹配。例如:
scanf("%d,%d",&n,&m);//該函式將其解釋成使用者將會輸入一個數字,一個逗號,然後再輸入一個逗號
scanf("%c",&ch);//從輸入的第一個字元開始讀取
scanf(" %c",&ch);//從第一個非空白字元開始讀取
#include<stdio.h>
#pragma warning(disable:4996)
int D22_1_varwid(void) {
	unsigned width, precision;
	int number = 256;
	double weight = 242.5;

	printf("Enter a field width:\n");
	scanf("%d", &width);
	printf("The number is :%*d:\n", width, number);
	printf("Now enter a width and a precision.\n");
	scanf("%d %d", &width, &precision);
	printf("Weight = %*.*f\n", width, precision, weight);
	printf("Done!\n");

	return 0;
}

三、原始碼: