2010-01-28 2 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

Manav, основываясь на некоторых ваших недавних вопросах, вам следовало бы прочитать учебник. –

+0

@Alok: Хорошо, я прочитал учебник, но не вдавался в такие подробности. Большинство учебников не дают примеров, обслуживающих использование в режиме реального времени. Я думаю, лучше всего было бы прочитать учебник «The Compiler Design». –

+1

@ Manav: Вам определенно не нужна книга «C Compiler Design». Вы пробовали K & R? –

ответ

83

Для Printf, то * позволяет определить минимальную ширину поля через дополнительный параметр, т.е. printf("%*d", 4, 100); задает ширину поля 4.

Для scanf, то * указывает на то, что поле должно быть прочитан, но игнорируется, так что scanf("%*d %d", &i) для ввода «12 34» будет игнорировать 12 и считать 34 в целое число i.

+0

измените это значение «printf («% * d », 4, 100); to "printf ("%. * d ", 4, 100);" .* должен быть использован. – Sridharan

5

* используется для пропуска вход, не подвергая его в любой переменной. Итак, scanf("%*d %d", &i); будет читать два целых числа и поставить второй в i.

Значение, которое было выведено в вашем коде, является значением, которое было в переменной неинициализированного i - вызов scanf не изменил его.

18

Звезда является символом флага, в котором говорится о игнорировании текста, прочитанного спецификацией. Чтобы qoute из документации GLibC:

необязательного символа флага `*», который говорит игнорировать текст чтения для данной спецификации. Когда scanf находит спецификацию преобразования, которая использует этот флаг, она считывает входные данные, как указано остальной частью спецификации преобразования, но отбрасывает этот вход, не использует аргумент указателя и не увеличивает количество успешных назначений.

Это полезно в тех случаях, когда строка спецификации содержит более одного элемента, например .: scanf("%d %*s %d", &i, &j) для "12 test 34" - где я & J являются целыми числами, и вы хотите, чтобы игнорировать все остальное.

6

См here

Необязательная отправная звездочка указует, что данные должны быть получены из стандартного ввода, но игнорируется, то есть он не хранится в соответствующем аргументе.

2

В scanf("%*d",&a)* пропускает вход. Для чтения входов необходимо использовать дополнительный "%d" в scanf. Например:

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 то а = 10 B = 30 с = 40.

Если вы используете "," в scanf, тогда после %*d значения не будут приниматься.е; scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/p: a = 10 b = 2 c = 3 будет выходом.

Смежные вопросы