fgets будет хранить нулевой терминатор вместе с возвратом каретки внутри буфера. Поэтому вы должны убедиться, что буфер достаточно большой, чтобы хранить ваши данные + нулевой терминатор + возврат каретки. Если вы берете один символ, например c, то это должен быть массив размером 3. Символ + 0 + \ n
Это также хорошая практика, чтобы обнулить ваши массивы.
#include <stdio.h>
int main() {
char c[3] = {0};
char s[20] = {0};
char sen[40] = {0};
fgets(c, sizeof(c), stdin);
fgets(s, sizeof(s), stdin);
fgets(sen, sizeof(sen), stdin);
return 0;
}
И используйте int main вместо void main.
Если вы хотите использовать односимвольный ввод в fgets, вы можете очистить поток ввода самостоятельно, читая, пока возврат каретки не будет извлечен из потока.
#include <stdio.h>
int main() {
char c;
char s[20] = {0};
char sen[40] = {0};
fgets(&c, sizeof(c), stdin);
while(getchar() != '\n'); //read until carriage return
fgets(s, sizeof(s), stdin);
fgets(sen, sizeof(sen), stdin);
return 0;
}