Các bước để loại bỏ ký tự dòng mới theo cách có lẽ rõ ràng nhất:
- Xác định độ dài của chuỗi bên trong
NAME
bằng cách sử dụng strlen()
, tiêu đề string.h
. Lưu ý rằng strlen()
không tính chấm dứt \0
.
size_t sl = strlen(NAME);
- Hãy xem nếu chuỗi bắt đầu bằng hoặc chỉ bao gồm một
\0
ký tự (chuỗi trống). Trong trường hợp này sl
sẽ là 0
vì strlen()
như tôi đã nói ở trên không đếm được \0
và dừng lại ở lần xuất hiện đầu tiên của nó:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Kiểm tra xem ký tự cuối cùng của chuỗi thích hợp có phải là ký tự dòng mới không
'\n'
. Nếu đây là trường hợp, thay thế \n
bằng a \0
. Lưu ý rằng số lượng chỉ mục bắt đầu tại 0
vì vậy chúng tôi sẽ cần phải làm NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Lưu ý nếu bạn chỉ nhấn Enter tại fgets()
yêu cầu chuỗi (nội dung chuỗi chỉ bao gồm một ký tự dòng mới), chuỗi trong đó NAME
sẽ là một chuỗi trống sau đó.
- Chúng ta có thể kết hợp bước 2. và 3. với nhau chỉ trong một giai đoạn
if
bằng cách sử dụng toán tử logic &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Mã hoàn thành:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Nếu bạn thích một hàm để sử dụng kỹ thuật này bằng cách xử lý các fgets
chuỗi đầu ra nói chung mà không cần gõ lại mỗi lần, thì đây là 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';
}
}
Trong ví dụ được cung cấp của bạn, nó sẽ là:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Lưu ý rằng phương thức này không hoạt động nếu chuỗi đầu vào có nhúng \0
s trong nó. Nếu đó là trường hợp strlen()
sẽ chỉ trả lại số lượng ký tự cho đến đầu tiên \0
. Nhưng đây không phải là một cách tiếp cận phổ biến, vì hầu hết các hàm đọc chuỗi thường dừng lại ở đầu tiên \0
và lấy chuỗi cho đến ký tự null đó.
Ngoài câu hỏi về chính nó. Cố gắng tránh các phủ định kép làm cho mã của bạn không rõ ràng : if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Bạn chỉ có thể làm if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(ít nhất là không sử dụng hai phủ định ,! và! =)