stdin getline wrapper
Nov 02 2020
ฉันต้องการอ่านบรรทัดจาก stdin โดยไม่รวมอักขระขึ้นบรรทัดใหม่ ฉันได้เขียนฟังก์ชัน:
/* read in a line from stdin, NULL on failure
* does not include trailing newline
*/
char*
readStdinLine() {
char* buffer;
size_t bufsize = 32;
size_t characters;
buffer = (char *) malloc(bufsize * sizeof(char));
if (buffer == NULL)
return NULL;
characters = getline(&buffer, &bufsize, stdin);
buffer[--characters] = '\0';
char* text = (char *) malloc(characters);
for (int i = 0; i < characters + 1; i++) {
text[i] = buffer[i];
}
free(buffer);
return text;
}
สิ่งนี้ดูเหมือนจะไม่เข้าใจฉันมักจะอ่านในบรรทัดสองครั้งหนึ่งครั้งใน getline และหนึ่งครั้งเพื่อลบบรรทัดใหม่ต่อท้าย ดูเหมือนจะไม่ใช่อัลกอริทึมที่มีประสิทธิภาพหน่วยความจำมากที่สุดและฉันต้องการลบบรรทัดใหม่โดยไม่ต้องคัดลอกหากเป็นไปได้
ฉันใหม่มากสำหรับ C (เคยใช้ C ++, Java และอื่น ๆ แต่ไม่เคยเป็นภาษาของระบบที่ไม่มีวัตถุ) ดังนั้นฉันจะขอบคุณที่เรียนรู้รูปแบบโค้ดทั้งหมดที่ฉันทำผิดเช่นกัน ขอบคุณ!
คำตอบ
7 MartinYork Nov 02 2020 at 01:17
ฟังก์ชันนี้สามารถเขียนได้ดังนี้:
char* readStdinLine()
{
char* buffer = NULL;
size_t bufsize = 0;
ssize_t characters = getline(&buffer, &bufsize, stdin);
if (characters == -1) {
free(buffer);
buffer = NULL;
}
else if (buffer[characters-1] == '\n') {
buffer[characters-1] = '\0';
}
return buffer;
}
getline()ฟังก์ชั่นทำทุกอย่างที่คุณต้องการ คุณต้องตรวจสอบข้อผิดพลาดและลบอักขระบรรทัดใหม่)