Langkah-langkah untuk menghapus karakter baris baru dengan cara yang mungkin paling jelas:
- Tentukan panjang string di dalam
NAME
dengan menggunakan strlen()
, header string.h
. Perhatikan bahwa strlen()
tidak termasuk penghentian \0
.
size_t sl = strlen(NAME);
- Lihat apakah string dimulai dengan atau hanya menyertakan satu
\0
karakter (string kosong). Dalam hal ini sl
adalah 0
karena strlen()
seperti yang saya katakan di atas tidak menghitung \0
dan berhenti pada kemunculan pertama itu:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Periksa apakah karakter terakhir dari string yang tepat adalah karakter baris baru
'\n'
. Jika demikian, ganti \n
dengan a \0
. Perhatikan bahwa penghitungan indeks dimulai pada 0
jadi kita perlu melakukan NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Catatan jika Anda hanya menekan Enter pada fgets()
permintaan string (konten string hanya terdiri dari karakter baris baru) string di NAME
akan menjadi string kosong sesudahnya.
- Kita dapat menggabungkan langkah 2. dan 3. bersama-sama hanya dalam satu
if
pernyataan dengan menggunakan operator logika &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Kode yang sudah selesai:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Jika Anda lebih suka fungsi untuk menggunakan teknik ini dengan menangani fgets
string keluaran secara umum tanpa mengetik ulang setiap waktu, berikut adalah 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';
}
}
Dalam contoh yang Anda berikan, itu akan menjadi:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Perhatikan bahwa metode ini tidak berfungsi jika string input telah tertanam \0
di dalamnya. Jika itu terjadi maka strlen()
hanya akan mengembalikan jumlah karakter sampai yang pertama \0
. Tapi ini bukan pendekatan yang umum, karena fungsi membaca string biasanya berhenti pada awalnya \0
dan mengambil string sampai karakter nol itu.
Selain dari pertanyaan itu sendiri. Cobalah untuk menghindari negations ganda yang membuat unclearer kode Anda: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Anda cukup melakukannya if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(paling tidak jangan gunakan dua negasi,! dan! =)