При выводе строки на экран появляется не нужный перенос строки - C (СИ)
Формулировка задачи:
Дорогие знатоки, проблема следующая: при выводе строки на экран появляется символ переноса строки появление которого моему уму не постижимо (в программировании слабоват). Надеюсь на вашу помощь) Собственно проблема на скрине.
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
#include <string.h>
#define N 3
char predmet1[20];
char predmet2[20];
char predmet3[20];
char shif_stud[] = "Шифр студента";
char shif_grup[] = "Шифр группы";
char FIO[] = "Ф.И.О. студента";
char sred[] = "Средний балл";
float alg_1(float a, float b, float c) //Вычесление среднего балла студента
{
float res = (a + b + c)/3;
return res;
}
struct student
{
int shif_stud; //Шифр студента
char FIO[20];
int shif_grup; //Шифр Группы
float ocenka1;
float ocenka2;
float ocenka3;
float sred; //Средний балл студента
} stud[N];
int main(void)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "rus");
int i, vibor1, vibor2;
printf("Пожалуйста, введите дисциплины обучения студентов (предметы):\n");
printf("Введите название 1 - ого предмета (до 20-ти знаков):");
gets (predmet1);
printf("Введите название 2 - ого предмета (до 20-ти знаков):");
gets (predmet2);
printf("Введите название 3 - ого предмета (до 20-ти знаков):");
gets (predmet3);
printf("Как вы хотите получить информацию о студентах?\n");
printf("1. - Из файла\n");
printf("2. - Вручную\n");
scanf("%d", &vibor1);
FILE *fp;
switch (vibor1)
{
case 1:
fp = fopen("K16-1.txt", "r");
if((fp = fopen("K16-1.txt", "r")) == NULL)
{
printf("ОШИБКА! Файла не существует!\n");
printf("Пожалуйста, введите информацию:\n");
}
else
{
for(i = 0; i < N; i++)
{
fgets(stud[i].FIO, 19, fp);
fscanf(fp, "%d\n", &stud[i].shif_stud);
fscanf(fp, "%d\n", &stud[i].shif_grup);
fscanf(fp, "%f\n", &stud[i].ocenka1);
fscanf(fp, "%f\n", &stud[i].ocenka2);
fscanf(fp, "%f\n", &stud[i].ocenka3);
fscanf(fp, "%f\n", &stud[i].sred);
}
fclose(fp);
break;
}
case 2:
fp = fopen("K16-1.txt", "w");
for (i = 1; i < N; i++)
{
printf("Введите Ф.И.О. %d-го студента (до 20-ти знаков):\n", i);
fflush(stdin);
fgets(stud[i].FIO, 20, stdin);
fputs(stud[i].FIO, fp);
printf("Введите шифр %d-го студента (6 знаков):\n", i);
scanf("%d", &stud[i].shif_stud);
fprintf(fp, "%d\n", stud[i].shif_stud);
printf("Введите шифр группы %d-го студента (6 знаков):", i);
scanf("%d", &stud[i].shif_grup);
fprintf(fp, "%d\n", stud[i].shif_grup);
printf("Введите оценку студента по дисциплине %s (1 знак):", predmet1);
scanf("%f", &stud[i].ocenka1);
fprintf(fp, "%f\n", stud[i].ocenka1);
printf("Введите оценку студента по дисциплине %s (1 знак):", predmet2);
scanf("%f", &stud[i].ocenka2);
fprintf(fp, "%f\n", stud[i].ocenka2);
printf("Введите оценку студента по дисциплине %s (1 знак):", predmet3);
scanf("%f", &stud[i].ocenka3);
fprintf(fp, "%f\n", stud[i].ocenka3);
stud[i].sred = alg_1(stud[i].ocenka1, stud[i].ocenka2, stud[i].ocenka3);
fprintf(fp, "%f\n", stud[i].sred);
}
fclose(fp);
break;
}
system("cls");
while (vibor2 != 4)
{
printf("_____________________________________________________________________________________________\n");
printf(" |-----------Меню----------| \n");
printf(" \n");
printf(" | Выберите пожалуйста действие | \n");
printf(" \n");
printf(" 1. - Вывести список студентов, получающих степендию \n");
printf(" 2. - Список студентов, умеющих неудовлетворительные оценки \n");
printf(" 3. - Вывод оценок студента по всем дисциплинам \n");
printf(" 4. - Выход \n");
printf("_____________________________________________________________________________________________\n");
scanf("%d", &vibor2);
system("cls");
switch (vibor2)
{
case 1:
printf("%-20s%-20s%-20s%-20s\n", shif_stud, shif_grup, FIO, sred);
for (i = 0; i < N; i++)
{
if (stud[i].sred >= 4)
{
printf("%-20d%-20d%-20s%-20f\n", stud[i].shif_stud, stud[i].shif_grup, stud[i].FIO, stud[i].sred);
}
}
getch();
system("cls");
break;
case 2:
printf("%-20s%-20s%-20s%-20s\n", shif_stud, shif_grup, FIO, sred);
for (i = 0; i < N; i++)
{
if (stud[i].sred < 3)
{
printf("%-21d%-20d%-20s%-20f\n", stud[i].shif_stud, stud[i].shif_grup, stud[i].FIO, stud[i].sred);
}
}
getch();
system("cls");
break;
case 3:
printf("%-20s%-20s%-20s%-20s%-20s%-20s\n", FIO, shif_grup, shif_stud, predmet1, predmet2, predmet3);
for (i = 0; i < N; i++)
{
printf("%-20s", stud[i].FIO);
printf("%-20d%-20d%-20f%-20f%-20f\n", stud[i].shif_grup, stud[i].shif_stud, stud[i].ocenka1, stud[i].ocenka2, stud[i].ocenka3);
}
getch();
system("cls");
break;
case 4:
printf("До свидания!");
getch();
break;
default:
printf("Неверное действие! Повторите ввод.");
getch();
system("cls");
break;
}
}
}Решение задачи: «При выводе строки на экран появляется не нужный перенос строки»
textual
Листинг программы
попробуйте так: fgets(stud[i].FIO, 20, stdin); for(int j = 0; stud[i].FIO[j]; j++) if(stud[i].FIO[j] == '\n') stud[i].FIO[j] = '\0';
Объяснение кода листинга программы
В данном коде предполагается, что мы работаем с массивом структур, где каждая структура содержит информацию о студенте. Каждый элемент массива представляет собой отдельного студента.
fgets(stud[i].FIO, 20, stdin);- Этот код считывает имя и фамилию студента (в формате FIO) с помощью функцииfgets. Переменнаяiиспользуется для обращения к конкретному элементу массива структур.for(int j = 0; stud[i].FIO[j]; j++)- Это цикл, который проходит по всем символам в строкеstud[i].FIO. Он продолжается, пока не встретит символ '\0' (конец строки).if(stud[i].FIO[j] == '\n')- Этот код проверяет, является ли текущий символ символом новой строки ('\n').stud[i].FIO[j] = '\0';- Если текущий символ является символом новой строки, он заменяется на символ конца строки ('\0'). Это делается для того, чтобы удалить символ новой строки из строкиstud[i].FIO. Однако, этот код может не работать должным образом, если ввод студенческих имен содержит символы новой строки. В таком случае, этот код может некорректно обрабатывать эти имена.