Yeni satır karakterini belki de en belirgin şekilde kaldırma adımları:
- Üstbilgiyi
NAME
kullanarak içerideki dizenin uzunluğunu belirleyin . Not sonlanan sayılmaz .strlen()
string.h
strlen()
\0
size_t sl = strlen(NAME);
- Dizenin bir
\0
karakterle (boş karakter) başlayıp başlamayacağına bakın . Bu durumda sl
olurdu 0
çünkü strlen()
ben saymak gelmiyor.Fark yukarıda söylediği gibi \0
ve bunun ilk geçtiği durur:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Doğru dizenin son karakterinin yeni satır karakteri olup olmadığını kontrol edin
'\n'
. Bu durumda, \n
a ile değiştirin \0
. Dizin sayımlarının başladığını unutmayın, 0
bu nedenle şunları yapmamız gerekir NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
fgets()
Dize isteğinde yalnızca Enter tuşuna bastıysanız (dize içeriği yalnızca bir yeni satır karakterinden oluşuyordu), NAME
dizenin bundan sonra boş bir dize olacağını unutmayın.
if
Mantık operatörünü kullanarak adım 2 ve 3'ü tek bir aşamada birleştirebiliriz &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Bitmiş kod:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
fgets
Çıktı dizelerini genel olarak her seferinde yeniden yazmadan işleyerek bu tekniği kullanmaktan hoşlanıyorsanız , işte burada fgets_newline_kill
:
void fgets_newline_kill(char a[])
{
size_t sl = strlen(a);
if(sl > 0 && a[sl - 1] == '\n')
{
a[sl - 1] = '\0';
}
}
Sağladığınız örnekte şöyle olur:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Giriş dizesi gömülü ise, bu yöntemin çalışmadığını unutmayın \0
. Durum böyle olsaydı strlen()
, sadece ilk karaktere kadar olan karakterlerin miktarını döndürürdü \0
. Ancak bu oldukça yaygın bir yaklaşım değildir, çünkü çoğu dize okuma işlevi genellikle ilk başta durur\0
ve dizeyi bu boş karaktere kadar alır.
Sorunun yanı sıra tek başına. Kodunuzu daha anlaşılır hale getiren çift olumsuzlamalardan kaçının if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Sadece yapabilirsin if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(en azından iki olumsuzlama kullanmayın,! ve! =)