При выводе строки на экран появляется не нужный перенос строки - 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
. Однако, этот код может не работать должным образом, если ввод студенческих имен содержит символы новой строки. В таком случае, этот код может некорректно обрабатывать эти имена.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д