Использование scanf с массивами символов и их размером
Я изучаю C с книгой по программированию на Deitel и Deitel. В большинстве случаев, когда они используют функцию сканирования, для char name[20];
они обычно пишут: scanf("%19s", name);
, чтобы избежать переполнения буфера.
Но что мы можем сделать, если длина массива является символической константой, скажем #define LENGTH 20
, Очевидно, используя scanf("%LENGTHs, name);
или даже scanf("%"LENGTH"s", name);
не очень помогает
Моя проблема также относится к функции fscanf, когда мы имеем дело с потоком, отличным от stdin
,
2 ответа
Как это:
#include <stdio.h>
#define STR_(x) #x
#define STR(x) STR_(x)
#define LENGTH 20
int main(void){
char name[LENGTH+1];
scanf("%" STR(LENGTH) "s", name);
puts(name);
return 0;
}
Смотрите Stringification для получения дополнительной информации об этом.
Лучше использовать fgets(buffer, sizeof(buffer), stdin)
Но если вы хотите использовать scanf(), вы можете создать формат во время выполнения или
переопределите ДЛИНУ, чтобы быть строкой;
#define LENGTH "20"
scanf(" %" LENGTH "[^\n]", name);
Редактировать:
попробуй это:
#include <stdio.h>
#define LENGTH "10"
int main(void) {
char name[20];
scanf(" %" LENGTH "[^\n]", name);
puts(name);
return 0;
}
Входные данные: abcdefghijklmnopqrstuvxyz
Выход: abcdefghij
Всего наилучшего.