2010-01-28 44 views
43

Cách sử dụng thực tế của các định dạng "%*" trong scanf(). Nếu định dạng này tồn tại, phải có một số mục đích đằng sau nó. Chương trình sau đây cho đầu ra kỳ lạ.Số nhận dạng định dạng scanf ("% * s") và scanf ("% * d") là gì?

#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; 
} 

Output:

[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

Manav, dựa trên một số câu hỏi gần đây của bạn, bạn sẽ làm tốt để đọc một cuốn sách văn bản. –

+0

@ Alok: Vâng, tôi đã đọc một cuốn sách văn bản nhưng chưa đi vào chi tiết như vậy. Hầu hết sách giáo khoa không cung cấp các ví dụ về việc sử dụng thời gian thực. Tôi nghĩ, điều tốt nhất để làm là đọc cuốn sách văn bản "The C Compiler Design". –

+1

@Manav: Bạn chắc chắn không cần một cuốn "C Compiler Design". Bạn đã thử K & R chưa? –

Trả lời

83

Đối với printf, các * cho phép bạn chỉ định chiều rộng lĩnh vực tối thiểu thông qua một tham số phụ, tức là printf("%*d", 4, 100); xác định chiều rộng lĩnh vực 4.

Đối scanf, các * chỉ ra rằng lĩnh vực này là để được đọc nhưng bỏ qua, do đó tức là scanf("%*d %d", &i) cho đầu vào "12 34" sẽ bỏ qua 12 và đọc 34 vào số nguyên i.

+0

hãy thay đổi "printf ("% * d ", 4, 100);" thành "printf ("%. * d ", 4, 100);" .* nên được sử dụng. – Sridharan

5

Các * được sử dụng để bỏ qua một đầu vào mà không đặt nó trong bất kỳ biến. Vì vậy, scanf("%*d %d", &i); sẽ đọc hai số nguyên và đặt số nguyên thứ hai vào i.

Giá trị được xuất trong mã của bạn chỉ là giá trị trong biến số i chưa được khởi tạo - cuộc gọi scanf đã không thay đổi.

18

Dấu sao là một ký tự cờ, cho biết bỏ qua văn bản đã đọc theo đặc điểm kỹ thuật. Để định tuyến từ tài liệu glibc:

Ký tự cờ tùy chọn `* ', cho biết bỏ qua văn bản đã đọc cho đặc điểm kỹ thuật này. Khi scanf tìm thấy một đặc tả chuyển đổi sử dụng cờ này, nó đọc đầu vào theo chỉ dẫn của phần còn lại của đặc tả chuyển đổi, nhưng nó loại bỏ đầu vào này, không sử dụng đối số con trỏ và không tăng số lượng các phép gán thành công.

Nó rất hữu ích trong các tình huống khi chuỗi đặc điểm kỹ thuật có chứa nhiều hơn một phần tử, Eg .: scanf("%d %*s %d", &i, &j) cho "12 test 34" - nơi i & j là các số nguyên và bạn muốn bỏ qua phần còn lại.

6

Xem here

Một tùy chọn khởi đầu dấu hoa thị chỉ ra rằng dữ liệu được lấy từ stdin nhưng bỏ qua, tức là nó không được lưu trữ trong đối số tương ứng.

2

Trong scanf("%*d",&a)* bỏ qua đầu vào. Để đọc đầu vào, người dùng phải sử dụng thêm "%d" trong scanf. Ví 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 

Nếu bạn sử dụng một %d tức là: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 sau đó a = 10 b = 30 c = 40.

Nếu bạn sử dụng "," trong scanf thì sẽ không có giá trị nào sau %*d i.e; scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/p: a = 10 b = 2 c = 3 sẽ là đầu ra.

Các vấn đề liên quan