Я воспроизвел ошибку связывания на DevC ++ , в котором getline()
кажется отсутствующим даже после принудительного применения последних C ревизий с помощью g cc параметров компилятора, таких как как -std=c11
.
Итак, я переписал ваш код, используя fgets()
:
char *fgets(char *s, int size, FILE *stream);
Он наверняка более переносимый, чем getline
, но имеет несколько отличий:
- Он читает до
size-1
символов, если новая строка не встречается до этого предела (он автоматически добавляет терминатор строки). Таким образом, он не управляет перераспределением буфера - Результирующая строка содержит символ
'\n'
, если он найден
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_STR_SIZE 32
int main( void )
{
int len = 0;
char *str;
printf("Please enter a string: ");
str = malloc(MAX_STR_SIZE); /* (1) */
while( 1 )
{
size_t newline_pos;
fgets( str, MAX_STR_SIZE, stdin );
/* (2) */
if( len == 0) /* (3) */
{
puts("You entered the following string: ");
}
newline_pos = strcspn(str, "\n" );
str[newline_pos] = '\0';
len += strlen(str); /* (4) */
fputs(str, stdout);
if(newline_pos < MAX_STR_SIZE-1) /* (5) */
break;
}
printf("\n\nCurrent size for string block: %d", len);
free( str ); /* (6) */
return 0;
}
Итак, в основном, я просто использую fgets
для чтения от stdin
, итерация до тех пор, пока не будет найден символ '\n'
. Чтобы понять, выполняется ли это условие, я использую функцию strcspn () , и я использую ту же функцию для удаления новой строки из полученной строки.
Несколько примечаний / предположений ( проверьте соответствующий номер в разделе кода):
- Приведение результата
malloc
требуется только в том случае, если вы компилируете с помощью компилятора C ++. Его можно опустить в C - Удалено
fgets
проверка ошибок: возвращает NULL в случае ошибки (символы не читаются до того, как будет найден EOF. Это не произойдет при чтении из stdin) - Проверяя
len==0
, мы убеждаемся, что "You entered the following string: "
печатается только один раз - Длина строки вычисляется путем суммирования длины строк, прочитанных на каждой итерации
- Условие
break
выполняется, если строка содержит '\n'
. В противном случае возвращаемое значение strcspn
будет MAX_STR_SIZE
- Даже если ОС освободит всю динамическую c память, используемую программой, при возврате это всегда хорошая привычка
free
ing это все равно