Как я могу получить строку из ввода без включения новой строки с использованием fgets?

Я пытаюсь написать введенную строку в другом месте и не знаю, как покончить с новой строкой, которая появляется как часть этой строки, которую я получаю с помощью stdin и fgets.

 char buffer[100];
 memset(buffer, 0, 100);
 fgets(buffer, 100, stdin);
 printf("buffer is: %s\n stop",buffer);

Я пытался ограничить количество данных, получаемых fgets, а также ограничивать, сколько данных записано, но новая строка остается. Как я могу просто получить введенную строку до последнего символа, написанного ничем иным?

Ответ 1

попробовать

fgets(buffer, 100, stdin);
size_t ln = strlen(buffer)-1;
if (buffer[ln] == '\n')
    buffer[ln] = '\0';

Ответ 2

Просто ищите потенциал '\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

Ответ 3

Из страниц руководства 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;