Soru scanf (“% * s”) ve scanf (“% * d”) biçim tanımlayıcıları nedir?


Formatların pratik kullanımı nedir "%*" scanf () içinde. Bu format mevcutsa, arkasında bir amaç olması gerekir. Aşağıdaki program garip çıktı verir.

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

Çıktı:

manav@workstation:~$ 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
manav@manav-workstation:~$ ./a.out
Enter text: manav
D
Enter interger: 12345
372
manav@workstation:~$

44
2018-01-28 15:16


Menşei


Manav, son zamanlardaki bazı sorulara dayanarak, bir kitap okumak için iyi olur. - Alok Singhal
@Alok: Eh, bir kitap okumuştum ama bu ayrıntılara girmemiştim. Çoğu metin kitabı gerçek zamanlı kullanıma yönelik örnekler sunmaz. Bence yapılacak en iyi şey "C Derleyici Tasarım" ders kitabını okumak olurdu. - manav m-n
@Manav: Kesinlikle bir "C Derleyici Tasarım" kitabına ihtiyacınız yok. K & R denediniz mi? - Alok Singhal
@Alok: K & R okumaya başlayacağım ama yine de C programlama kursunun, İşletim Sistemleri ve "C Derleyici Tasarımı" hakkında yeterli bilgiye sahip olmadan eksik olduğunu hissediyorum. - manav m-n
@Manav: man 3 printf sorunuza da cevap verirdi. - jamesdlin


Cevaplar:


Printf için *, ek bir parametre ile minimum alan genişliğini belirtmenize izin verir, örn. printf("%*d", 4, 100); 4 alan genişliğini belirtir.

İçin scanf*, alanın okunacağını ancak göz ardı edildiğini belirtir, yani, yani; scanf("%*d %d", &i) "12 34" girişi için 12'yi yok sayar ve 34'ü tamsayıya (i) girer.


86
2018-01-28 15:21



lütfen bu "printf" ("% * d", 4, 100); " "printf ("%. * d ", 4, 100);" .* kullanılmalıdır. - Sridharan


Yıldız, belirtim tarafından okunan metni görmezden gelen bir bayrak karakteridir. Glibc belgelerinden qoute etmek için:

Bu belirtim için okunan metni yok saydığını söyleyen isteğe bağlı bir bayrak karakteri olan * *. Scanf, bu bayrağı kullanan bir dönüşüm belirtimi bulduğunda, girdiyi dönüşüm belirtiminin geri kalanı tarafından yönlendirildiği gibi okur, ancak bu girdiyi atar, bir işaretçi argümanı kullanmaz ve başarılı ödevlerin sayısını artırmaz.

Belirtim dizesinin birden fazla öğe içerdiği durumlarda yararlıdır, örn .:   scanf("%d %*s %d", &i, &j) için "12 test 34" - nerede ben & j tamsayılar ve geri kalanını görmezden gelmek istersiniz.


18
2018-01-28 15:20





Görmek İşte

İsteğe bağlı bir başlangıç ​​işareti, verilerin stdin'den alınacağını ancak göz ardı edildiğini, yani karşılık gelen argümanda saklanmadığını belirtir.


6
2018-01-28 15:20





* herhangi bir değişkene koymadan bir girişi atlamak için kullanılır. Yani scanf("%*d %d", &i); iki tam sayı okur ve ikincisini i.

Kodunuzda çıkarılan değer, henüz başlatılmamış olan değerdir i değişken - scanf araması onu değiştirmedi.


5
2018-01-28 15:20





İçinde scanf("%*d",&a)  * girişi atlar. Girdileri okumak için bir tane daha kullanmak zorundadır. "%d" içinde scanf. Örneğin:

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

O / s:

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

Başka kullanırsan %d  yani: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 daha sonra a = 10 b = 30 c = 40.

Eğer kullanırsan "," scanf sonra sonra hiçbir değer alınacak %*d yani;      scanf("%d %*d,%d" &a,&b,&c)// 10 20 30     O / s:     a = 10 b = 2 c = 3 çıktı olacaktır.


2
2017-09-23 15:49