ขั้นตอนในการลบอักขระบรรทัดใหม่ด้วยวิธีที่ชัดเจนที่สุด:
- กำหนดความยาวของภายในสตริง
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);
}
โปรดทราบว่าวิธีนี้ใช้ไม่ได้หากสตริงอินพุตมีการฝัง\0s ไว้ หากที่จะเป็นกรณีเดียวที่จะกลับมาจำนวนตัวอักษรจนกว่าแรก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))(อย่างน้อยอย่าใช้การปฏิเสธสองแบบ! และ! =)