Вот короткая версия, которая работает с использованием scanf
:
#include <stdio.h>
int main(void) {
char buffer[20 + 1] ; // 20 characters + 1 for '\0'
int nread ;
nread = scanf("%20[^\n]", buffer) ; // Read at most 20 characters
printf("%s\n", buffer);
return 0;
}
scanf
автоматически добавит '\0'
символ в нужном месте в buffer
и с "%20[^\n]"
он будет читать в большинстве 20 символов, отличных от '\n'
.
Если вы хотите поместить это в функции и избежать повторений 20
(ошибки):
#include <stdio.h>
int read_chars (char buffer[], int len) {
char format[50] ;
sprintf(format, "%%%d[^\n]", len);
return scanf(format, buffer) ;
}
#define MAX_CHARS 20
int main(void) {
char buffer[MAX_CHARS + 1] ; // 20 characters + 1 for '\0'
read_chars (buffer, MAX_CHARS) ;
printf("%s\n", buffer);
return 0;
}
Edit: Если вы не хотите использовать sprintf
создать строку формата, вы могли бы использовать препроцессор (не будет работать, если MAX_CHARS
не препроцессор константа):
#include <stdio.h>
#define _READ_CHARS(buffer, N) scanf("%" #N "[^\n]", buffer)
#define READ_CHARS(buffer, N) _READ_CHARS(buffer, N)
#define MAX_CHARS 20
int main(void) {
char buffer[MAX_CHARS + 1] ; // 20 characters + 1 for '\0'
READ_CHARS (buffer, MAX_CHARS) ;
printf("%s\n", buffer);
return 0;
}
Не могли бы вы показать нам, что вы пробовали до сих пор? –
прочитайте на буферизованном входе, он будет на вашем пути –
Если длина ввода меньше 20 символов, 'scanf()' вернет '0', когда вы пройдете мимо конца. – Barmar