2010-01-26 15 views
48

Çalışma zamanında dizenin uzunluğunu bildiğimi farz edersek, printf kullanarak boş olmayan sonlandırılmış bir dizeyi nasıl yazdırabilirim? Birlikte diğer args ileBoş olmayan sonlandırılmış bir dizeyi printf kullanarak nasıl yazdırabilirim?

+3

Neden fwrite kullanmıyorsunuz? –

+4

Boş bırakılmadıysa, tanım gereği bir dize değil. –

+3

sadece bir _c string_ değil, diğer dillerde geçerli bir dize olacağından .. ve "null olmayan sonlandırılmış bir char dizisi" daha doğru olsa da, evrensel olarak anlaşıldığından eminim. – Willdorf

cevap

81
printf("%.*s", length, string); 

Kullanım: C

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number); 
//       ^^^^      ^^^^^^^^^^^^^^ 

Eğer %.123s formatı ile çıkışa maksimum uzunluğu belirtebilirsiniz. Bu, çıkış uzunluğunun en fazla 123 karakter olduğu anlamına gelir. 123, * ile değiştirilebilir, böylece uzunluk, hard-kodlanmış yerine printf argümanından alınacaktır.

Not Bu varsayar string her iç boş bayt içermez (\ 0), %.123s sadece fazla uzunluğunu da tam uzunluğu kısıtlar, ve şeritler hala kabul edilir boş sonlandırılmış.

Boş olmayan null sonlandırılmış bir dize yazdırmak isterseniz, tek bir printf kullanamazsınız. Bunun yerine fwrite kullanın:

fwrite(string, 1, length, stdout); 

ayrıntılı bir açıklama için @M.S.Dousti's answer bakınız.

+0

Hızlı yanıt için teşekkürler ! – Mike

+5

not: 'length', varsayılan argüman tanıtımlarından sonra 'int' türüne sahip olmalıdır. "Length" değişkeniniz daha büyükse (ör. "Size_t"), onu (int) 'a çevirmelisiniz, aksi takdirde kodunuz" size_t "nin int' 'den daha geniş olduğu bir platformda kırılacaktır. –

13

@KennyTM tarafından sağlanan cevap harika, ancak bir incelikle. beklendiği gibi Genelde

, dize "sonlandırıldı" boş olmayan, ancak ortada bir null karakteri varsa, printf("%.*s", length, string); çalışmaz. %.*s biçim dizesi maksimumlength ait karakterleri, değil tamlength karakterleri yazdırmak için printf ister olmasıdır.

Doğrusu OP altındaki bir yorumda @William Pursell tarafından daha genel bir çözüm işaret kullanmayı tercih ediyorum

:

#include <stdio.h> 

int main(void) { 
    size_t length = 5; 

    char string[length]; 
    string[0] = 'A'; 
    string[1] = 'B'; 
    string[2] = 0;  // null character in the middle 
    string[3] = 'C'; 
    string[4] = 'D'; 

    printf("With printf: %.*s\n", length, string); 
    printf("With fwrite: "); 
    fwrite(string, sizeof(char), length, stdout); 
    printf("\n"); 

    return 0; 
} 

Çıktı:

İşte
fwrite(string, sizeof(char), length, stdout); 

bir örnek kod var
With printf: AB 
With fwrite: AB CD 
+1

'sizeof (char)' tanıma göre 1'dir. Ayrıca, 'NULL', özellikle boş bir * işaretçi * sabiti. –

+0

@KeithThompson, 'sizeof (char)' daha semantiktir. Ayrıca, '' 0 '' 0'dan daha anlamlıdır. Ama kim umursar ;-) –

İlgili konular