- printf()的返回值為其輸出字符串常量的字符數(注意字符數與字數的區別)注意計數針對所有的打印字符,包括空格和不可見的換行字符(不包括字符串的空字符)。
- scanf()函數返回成功讀入的項目的個數。即在下面程序中scanf的返回值為1。如果沒有讀取任何項目(如它期望一個數字但是出入了一個非數字字符),它會返回值0。當它檢測到“文件結尾”時,它返回EOF(EOF是文件stdio.h中定義的特殊值。一般,#define 指令把EOF 的值定義為 -1)。 int n;
float p;
n= scanf("%f",&p);
printf("%d,%f",n,p);
n= scanf("%f",&p);
printf("%d,%f",n,p);
用%c讀入空格和字符的問題。
如果在格式字符串中%c之前有一個空格,那么scanf()會跳到第一個非空白字符處。也就是說,
命令scanf(“%c”,&ch)讀取在輸入中遇到的第一個字符,而scanf(“ %c”,&ch)(%c前有個空格)則讀取遇到的第一個非空白字符。
對於同時輸入幾個字符,如果逗號(或任何非空格字符)和第一個%c之間沒有間隔,則輸入時,第一個字符與逗號之間也不能有間隔;如果有空格,則輸入時,第一個字符和逗號之間可以有任意多個字符,也可以是0個。如果逗號和第二個%c之間沒有間隔,則逗號和第二個輸入字符間也不能有間隔。如果有空格,則輸入時,第二個字符和逗號之間可以有任意多個字符,也可以是0個。
printf()函數的*修飾符(*滯后賦值,例:%*d)
假定不想事先制定字段寬度,而是希望由程序來指定該值,可以在字段寬度部分使用*來代替數字來達到目的,但是也必須使用一個參數來告訴函數字段寬度應該是什么。也就是說,如果轉換說明符是%*d ,那么參數列表中應該包括一個 * 值和一個 d 的值。同時這種方式也可以和浮點數一起使用來指定精度和字段寬度。
例:
printf("What field width?\n");
scanf("%d", &width);
printf("The number is: %*d:\n", width, num);
printf("Enter a width and a precision:\n");
scanf("%d %d", &width, &precision);
printf("Weight = %*.*f\n", width, precision, weight);
scanf("%d", &width);
printf("The number is: %*d:\n", width, num);
printf("Enter a width and a precision:\n");
scanf("%d %d", &width, &precision);
printf("Weight = %*.*f\n", width, precision, weight);
結果:
What field width?
7
The number is: 256:
Enter a width and a precision:
3 7
Weight = 123.4500000
7
The number is: 256:
Enter a width and a precision:
3 7
Weight = 123.4500000
scanf()函數的*修飾符
在scanf()函數中,當把 * 放在 % 和說明符字母之間時,它使函數跳過相應的輸入項目。
例:
int i,j;
scanf("%d%*d%d",&i,&j);
printf("%d,%d\n",i,j);
scanf("%d%*d%d",&i,&j);
printf("%d,%d\n",i,j);
輸出結果為:
2 3 5
i=2,j=5
i=2,j=5
/*
通過while循環把上面 i 輸入后的多的垃圾字符跳過
如果沒有while循環,在調試時輸入 i = 123asdfg
在Vc++6.0中的輸出結果為:
123asdfg
i = 123
j = -858993460
*/
int scan1,scan2;
char ch;
scanf("%d", &scan1);
printf("scan1= %d\n", scan1);
while ( (ch=getchar()) != '\n')
continue ;
scanf("%d", &scan2);
printf("scan2 = %d\n", scan2);
通過while循環把上面 i 輸入后的多的垃圾字符跳過
如果沒有while循環,在調試時輸入 i = 123asdfg
在Vc++6.0中的輸出結果為:
123asdfg
i = 123
j = -858993460
*/
int scan1,scan2;
char ch;
scanf("%d", &scan1);
printf("scan1= %d\n", scan1);
while ( (ch=getchar()) != '\n')
continue ;
scanf("%d", &scan2);
printf("scan2 = %d\n", scan2);
參數傳遞的原理
float n1 = 3.0;
double n2 = 3.0;
long n3 = 2000000000;
long n4 = 1234567890;
printf("%ld, %ld, %ld, %ld\n", n1, n2, n3, n4);
結果為:
2000000000, 1234567890, 3, 64
該調用告訴計算機把變量n1、n2、n3、n4的值傳遞給計算機,計算機把它們放置到被稱為堆棧(stack)的一塊內存區域中來實現。計算機根據變量的類型而非轉換說明符把這些值放到堆棧中。所以,n1 在堆棧中占用8個字節(float 被轉換成 double)。同樣,n2 也占用8個字節,而n3 和n4 則分別占用4個字節。然后控制轉移到 printf()函數。該函數從堆棧把值讀出來,但是在讀出時,它根據轉換說明符去讀。 %ld 說明符指出, printf() 應該讀取4個字節,所以 printf()在堆棧中讀取前4個字節作為它的第一個值。這就是n1的前半部分,它被解釋成一個長整數。下一個 %ld說明符再讀取4個字節,這就是n1 的后半部分,它被解釋成第二個長整數。同樣,%ld 的第三個和第四個實例使得 n2 的前半部分和后半部分被讀出,並被解釋成2個長整數。