2015-07-12 21 views
6

Sözlüğümden okuma ve kelimeyi + test amacıyla sözcüğün uzunluğunu basıyorum.strlen doğru dize uzunluğu verilmiyor C

Dizenin uzunluğunu almak için strlen kullanıyorum. Ancak, sahip olduğum rakamlar doğru değil. Ben strlen \ 0 karakterini saymaz inanıyorum.

Sözlükte ilk 10 kelimeyi okuyorum.

W:A L:1 
W:A's L:3 
W:AA's L:4 
W:AB's L:4 
W:ABM's L:5 
W:AC's L:4 
W:ACTH's L:6 
W:AI's L:3 
W:AIDS's L:6 
W:AM's L:4 

Ama bu bende ne olduğunu: My beklenen çıkışı olmalıdır (nasıl L edin. Sorundur nerde başka hattı üzerinde bu olduğunu düşünüyorum): Aşağıda

W:A 
L:2 
W:A's 
L:4 
W:AA's 
L:5 
W:AB's 
L:5 
W:ABM's 
L:6 
W:AC's 
L:5 
W:ACTH's 
L:7 
W:AI's 
L:5 
W:AIDS's 
L:7 
W:AM's 
L:5 

Benim kodum:

+2

'fgets()' sonucu, genellikle '' \ n'' içerir. Kesmek için, mutlaka bir kopya olmasına rağmen, http://stackoverflow.com/a/28462221/2410359 BTW, güzel biçimlendirilmiş bir soruya bakın. – chux

+1

"Ben strlen'in" \ 0 "karakterini saymadığına inanıyorum." - Hayır, öyle değil ve yapması gerekmiyor. (Sisteminiz man sayfalarına sahipse, strlen işlevi "strlen" işlevine bir atıfta bulunur.) –

cevap

7

fgets() Yeni satırda yeterli alan varsa arabelleği okur. Sonuç olarak, word'u yazdırdığınızda yazdırılan yeni satırı görürsünüz.

fgets() s ile gösterilen tampon içine akışı ve saklar boyut karakterini göre en çok bir daha şöyledir: fgets kılavuzu kaynaktan. Okuma, bir EOF veya yeni hattan sonra durur. Bir satırsonu okunduğunda, arabelleğine kaydedilir. Sonlandırıcı bir boş bayt ('\ 0') arabelleğe son karakterinden sonra depolanır.

(vurgu benim) Kendin kırpmak zorunda

: En tampon word her seferinde içine '\ n'

while(i < 10 && fgets(word, sizeof(word), dict) != NULL) { 
    size_t len = strlen(word); 
    if (len > 0 && word[len-1] == '\n') word[len] = '\0'; 

    printf("W:%s L:%d\n", word, (int)strlen(word)); 
    i++; 
} 
4

nedenidir fgets satır karakteri çeker çünkü her seferinde 1 daha yüksek bir sayıya yol açar.

+1

Bir dosyadaki son satır okunduğunda, _not_ '' tadı aranamayacak bir şey değildir \ n''. Yani 'fgets() 'her zaman bir' '\ n'' içinde çekmez. – chux

+0

, 'fgets() ', satırsonu karakteri varsa, dediğim gibi bir' '\ n' 'ifadesini alır. Belli ki, eğer belgenin bir satırsonu karakteri yoksa, o zaman fgets bir tane üretmeyecektir. –

+0

da, yeni satır eklemek için arabellek yeterli alan yoksa, sonraki 'fgets()' alırsınız. –