2010-01-28 57 views
43

scanf()中格式"%*"的實際用法是什麼?如果這種格式存在,它必須有一些目的。下面的程序給出了奇怪的輸出。什麼是scanf(「%* s」)和scanf(「%* d」)格式標識符?

#include<stdio.h> 
int main() 
{ 
     int i; 
     char str[1024]; 

     printf("Enter text: "); 
     scanf("%*s", &str); 
     printf("%s\n", str); 

     printf("Enter interger: "); 
     scanf("%*d", &i); 
     printf("%d\n", i); 
     return 0; 
} 

輸出:

[email protected]:~$ gcc -Wall -pedantic d.c 
d.c: In function ‘main’: 
d.c:8: warning: too many arguments for format 
d.c:12: warning: too many arguments for format 
[email protected]:~$ ./a.out 
Enter text: manav 
D 
Enter interger: 12345 
372 
[email protected]:~$ 
+0

馬納夫,根據你最近的一些問題,你會很好地閱讀一本教科書。 – 2010-01-28 15:20:48

+0

@Alok:好的,我已經閱讀了一本教科書,但沒有進入這些細節。大多數教科書不提供適合實時使用的示例。我認爲,最好的做法是閱讀「C編譯器設計」教科書。 – 2010-01-28 15:29:40

+1

@Manav:你絕對不需要「C編譯器設計」一書。你嘗試過K&R嗎? – 2010-01-28 15:33:10

回答

83

對於printf的,則*允許通過一個額外的參數指定最小字段寬度,即printf("%*d", 4, 100);指定4.

場寬度。scanf,*表示該字段是要被讀取但忽略,因此,即輸入「12 34」的scanf("%*d %d", &i)將忽略12並將34讀入整數i。

+0

請更改此「printf(」%* d「,4,100);」到「printf(」%。* d「,4,100);」 *應該被使用。 – Sridharan 2017-07-20 05:42:13

5

*用於跳過的輸入而不把它在任何變量。所以scanf("%*d %d", &i);會讀取兩個整數,並將第二個整數寫入i

代碼中輸出的值只是未初始化的變量i中的值 - scanf調用不會改變它。

18

星號是一個標誌字符,它表示忽略規範讀取的文本。 從glibc的文檔qoute:

一個可選的標誌字符'*」,它說忽略閱讀本說明書中的文字。當scanf找到使用該標誌的轉換規範時,它將按照轉換規範的其餘部分讀取輸入,但會丟棄該輸入,不使用指針參數,也不會增加成功分配的計數。

在規範字符串中包含多個元素,如: scanf("%d %*s %d", &i, &j)"12 test 34"它是在情況下非常有用 - 在 & Ĵ是整數,你希望忽略休息。

6

參見here

可選起始星號表示該數據將要被從stdin檢索但忽略,即,它不被存儲在相應的參數。

2

scanf("%*d",&a)*跳過輸入。爲了讀取輸入,必須在scanf中使用額外的"%d"。例如:

int a=1,b=2,c=3; 
    scanf("%d %*d %d",&a,&b,&c); //input is given as: 10 20 30 

O/P:

a=10 b=30 and c=3; // 20 is skipped 

如果使用其他%d即:scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 則a = 10 B = 30 C = 40。

如果您在scanf中使用",",那麼在%*d之後將不會執行任何值。Ë; scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/P: a = 10 b = 2 c = 3將是輸出。

相關問題