Ответ 1
попробовать
fgets(buffer, 100, stdin);
size_t ln = strlen(buffer)-1;
if (buffer[ln] == '\n')
buffer[ln] = '\0';
Я пытаюсь написать введенную строку в другом месте и не знаю, как покончить с новой строкой, которая появляется как часть этой строки, которую я получаю с помощью stdin и fgets.
char buffer[100];
memset(buffer, 0, 100);
fgets(buffer, 100, stdin);
printf("buffer is: %s\n stop",buffer);
Я пытался ограничить количество данных, получаемых fgets, а также ограничивать, сколько данных записано, но новая строка остается. Как я могу просто получить введенную строку до последнего символа, написанного ничем иным?
попробовать
fgets(buffer, 100, stdin);
size_t ln = strlen(buffer)-1;
if (buffer[ln] == '\n')
buffer[ln] = '\0';
Просто ищите потенциал '\n'
.
После вызова fgets()
, если существует '\n'
, он будет последним char
в строке (непосредственно перед '\0'
).
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
buffer[--len] = '\0';
}
Пример использования
char buffer[100];
// memset(buffer, 0, 100); not needed
if (fgets(buffer, sizeof buffer, stdin) == NULL) { // good to test fgets() result
Handle_EOForIOerror();
}
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
buffer[--len] = '\0';
}
printf("buffer is: %s\n stop",buffer);
Примечание:
buffer[strlen(buffer)-1]
опасен в редких случаях, когда первым char
в buffer
является '\0'
(встроенный нулевой символ).
scanf("%99[^\n]%*c", buffer);
является проблемой, если первым char
является '\n'
, ничего не читается и '\n'
остается в stdin
.
strlen()
быстр по сравнению с другими методами: https://codereview.stackexchange.com/a/67756/29485
Или сверните свой код, например, gets_sz
Из страниц руководства linux:
fgets(): [...] Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. [...]
Следовательно, если вы хотите использовать эту функцию, вы можете удалить ее вручную. С другой стороны, вы можете использовать fgetc для получения символов до тех пор, пока не найдете '\n'
и не включите его в буфер. Это было бы так:
char c;
while((c=fgetc(stdin)) != '\n')
buffer[i++] = c;