ขั้นตอนในการลบอักขระบรรทัดใหม่ด้วยวิธีที่ชัดเจนที่สุด:
- กำหนดความยาวของภายในสตริง
NAME
โดยใช้ส่วนหัวstrlen()
string.h
โปรดทราบว่าไม่นับยุติstrlen()
\0
size_t sl = strlen(NAME);
- ดูว่าสตริงเริ่มต้นด้วยหรือมีเพียงหนึ่ง
\0
ตัวอักษร (สตริงว่าง) ในกรณีนี้sl
จะเป็น0
เพราะstrlen()
อย่างที่ฉันได้กล่าวไว้ข้างต้นไม่นับ\0
และหยุดเมื่อเกิดขึ้นครั้งแรก:
if(sl == 0)
{
// Skip the newline replacement process.
}
'\n'
ตรวจสอบว่าตัวอักษรตัวสุดท้ายของสายที่เหมาะสมเป็นตัวละครขึ้นบรรทัดใหม่ หากเป็นกรณีนี้แทนด้วย\n
\0
โปรดทราบว่าการนับดัชนีเริ่มต้นที่0
เราจะต้องทำNAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
หมายเหตุหากคุณกด Enter ที่fgets()
คำขอสตริงเท่านั้น (เนื้อหาสตริงประกอบด้วยอักขระขึ้นบรรทัดใหม่เท่านั้น) สตริงในNAME
จะเป็นสตริงว่างหลังจากนั้น
- เราสามารถรวมขั้นตอนที่ 2 และ 3 เข้าด้วยกันในสถานะเดียว
if
โดยใช้ตัวดำเนินการตรรกะ&&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- รหัสสำเร็จรูป:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
หากคุณต้องการฟังก์ชั่นสำหรับใช้เทคนิคนี้โดยการจัดการfgets
สตริงเอาต์พุตโดยทั่วไปโดยไม่ต้องพิมพ์ซ้ำทุกครั้งนี่คือ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';
}
}
ในตัวอย่างที่คุณให้มามันจะเป็น:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
โปรดทราบว่าวิธีนี้ใช้ไม่ได้หากสตริงอินพุตมีการฝัง\0
s ไว้ หากที่จะเป็นกรณีเดียวที่จะกลับมาจำนวนตัวอักษรจนกว่าแรกstrlen()
\0
แต่นี่ไม่ใช่วิธีการทั่วไปเนื่องจากฟังก์ชั่นการอ่านสตริงส่วนใหญ่มักจะหยุดที่แรก\0
และใช้สตริงจนกระทั่งตัวอักษรเป็นโมฆะ
นอกเหนือจากคำถามด้วยตัวมันเอง พยายามหลีกเลี่ยงการ negations คู่ที่ทำให้ unclearer if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
รหัสของคุณ: if (fgets(Name, sizeof Name, stdin) == NULL) {}
คุณก็สามารถทำได้
if (!fgets(Name, sizeof Name, stdin))
(อย่างน้อยอย่าใช้การปฏิเสธสองแบบ! และ! =)