Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226

Компилир. но не работают 2 scanf подрят

07.10.2011, 21:11. Показов 6944. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть кода: есть две структуры студент. Заполнение с клавиатуры. Нужно отсортировать по имени от А до Я. Но с вводом проблема. Первый студент заполняеться без проблем, а второй без фамилии(Прізвище).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define M 2
struct ST
 {
    char name[100];
    char lastname[20];
    int year;
    int num;
    double mark;
}ST[M],temp;
int main()
{
    setlocale(LC_ALL,"Rus");
      for(int i=0; i<M; i++)
        {
            printf("Студент №%d:\n",  i+1);
                printf("\tПрiзвище студента\n");//от сюда
                scanf("%s",&ST[i].lastname);//до сюда пролетает на втором шаге цыкла
                printf("\tiм'я студента\n");
                scanf("%s",&ST[i].name);
                printf("\tрiк народження студента:\n");
                scanf("%d",&ST[i].year);
                printf("\tНомер групи:\n");
                scanf("%d",&ST[i].num);
                printf("\tСереднiй бал успiшностi:\n");
                scanf("%lf",&ST[i].mark);   
        }
 
       for(int i=0; i<M; i++)
        {
            printf("Студент №%d:\n",  i+1);
                printf("\tПрiзвище та iм'я студента: %s %s. ",ST[i].lastname,ST[i].name);
                printf("Рiк народження студента:%d\n",ST[i].year);
                printf("\tНомер групи:%d. ",ST[i].num);
                printf("Середнiй бал успiшностi:%2.1lf\n",ST[i].mark);
        }
       
       int count=0;
        for(int i=0; i<M; i++)
        {
            if(ST[i].mark<6){
            printf("Студент з балом <6:\n");
                printf("\tПрiзвище та iм'я студента: %s %s. ",ST[i].lastname,ST[i].name);
                printf("Рiк народження студента:%d.\n",ST[i].year);
                printf("\tНомер групи:%d. ",ST[i].num);
                printf("Середнiй бал успiшностi:%2.1lf\n",ST[i].mark);
                count++;}
        }
        if(count==0) printf("Таких студентiв немає!");
        printf("\n\nВiдсортований список по iм'ях:\n");
        for(int i=0; i<M-1;i++)
        {
            if(strcmp(ST[i].name,ST[i+1].name)==1)
            {
                temp=ST[i+1];
        ST[i+1]=ST[i];
        ST[i]=temp;
            }
        }
        //Отсорт. структура
        for(int i=0; i<M; i++)
        {
            printf("Студент №%d:\n",  i+1);
                printf("\tПрiзвище та iм'я студента: %s %s. ",ST[i].lastname,ST[i].name);
                printf("Рiк народження студента:%d\n",ST[i].year);
                printf("\tНомер групи:%d. ",ST[i].num);
                printf("Середнiй бал успiшностi:%2.1lf\n",ST[i].mark);
        }
      return 0;
}
Вот такое предупреждение выкинул Visual Studio 2010:"Предупреждение 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\documents and settings\администратор.tabulorasa\мои документы\visual studio 2010\projects\struct_sort_name!\struct_s ort_name!\struct_sort_name!.cpp 21
"
Препод 15 минут думал и говорит, что не знает.
Если написать 1 сканф для фамилии и имени, то его на втором шаге цыкла просто не будет(даже имя не смогу заполнить, потому разбил на 2 сканф)

В нете на этот варнинг нашёл:
"Ну так это же варнинги просто Ошибок-то нету. Вместо scanf напиши scanf_s (по моему там не требуется доп. аргументов)"
C
1
2
float e=0;
scanf_s("%f",&e);
но я ставлю _s и при первом же вводе завершается программа. Помогите пожалуйста.

Добавлено через 8 минут
C
1
2
3
4
5
6
printf("\tрiк народження студента:\n");
                scanf("%d",&ST[i].year);
                printf("\tНомер групи:\n");
                scanf("%d",&ST[i].num);
                printf("\tСереднiй бал успiшностi:\n");
                scanf("%lf",&ST[i].mark);
если удалить этот ввод, то работает... в чём же проблема...???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2011, 21:11
Ответы с готовыми решениями:

Scanf(),getchar() не работают в функции
Здравствуйте по какой причине scanf(),getchar() программа не видит внутри какой то функции не scanf(), не getchar() просто пролетает...

RecyclerView создается несколько раз подрят
Суть проблемы: Есть TabbedActivity ней 6 вкладок в каждой фрагмент со своим RecyclerView Если перейти на 6 вкладку а затем вернуться...

Замена стоящих подрят пробелов на один пробел
Доброй ночи. Начал изучать Си по книге Б.Керриган Д.Ритчи столкнулся с задачей: &quot;Напишите программу, копирующую символы ввода в...

29
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
08.10.2011, 19:15  [ТС]
Студворк — интернет-сервис помощи студентам
alkagolik, Дружище! Ты наставил на истинный путь!
Я нашёл тему(вродь об которой ты говорил) и вот:
прописывешь библиотеку <windows.h>, в мэйне пишешь: SetConsoleCP(1251); SetConsoleOutputCP(1251);
потом в свойствах командной строки выбери шрифт Lucida Console. должно помочь
Сделал как написано и заработало!!!. Я скоро с этой кирицей стану . Тебе респект! =) Вот скрин консоли:
Миниатюры
Компилир. но не работают 2 scanf подрят  
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
08.10.2011, 19:22
а если еще прикрутить Windows PowerShell, то виндовс может быть вполне даже привлекательной. успехов
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
08.10.2011, 19:40  [ТС]
alkagolik, Спасибо! И тебе успехов!!!
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
09.10.2011, 12:10
посмотрел твои скрины
а ты попробуй ввести 10,0
потому что он явно у тебя точку частью вещественного числа не считает
по вопросу со второго скрина: имя массива всегда преобразуется в адрес его первого элемента
1
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
09.10.2011, 15:00  [ТС]
вы были правы, но они работают по разному, локале и на первом скрине две функ. с параметром (1251)
Миниатюры
Компилир. но не работают 2 scanf подрят   Компилир. но не работают 2 scanf подрят   Компилир. но не работают 2 scanf подрят  

0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
09.10.2011, 15:29  [ТС]
что касается ввода кириллицы, то setlocale() не работает(первый скрин), а на втором и ввод и вывод кириллицы. Для setlocale() замена шрифта не помогла, а вариант на втором скрине требует замену шрифта(там показано).
Миниатюры
Компилир. но не работают 2 scanf подрят   Компилир. но не работают 2 scanf подрят  
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
09.10.2011, 16:14  [ТС]
со scanf() разобрались, а вот gets() пролетает, а следующий gets() работает. Не поможете? На скринах поподробнее.
Миниатюры
Компилир. но не работают 2 scanf подрят   Компилир. но не работают 2 scanf подрят  
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
09.10.2011, 16:18  [ТС]
вот код двох задач: первая и вторая(портировка по номеру телефона)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
//#include <locale.h>
#include <windows.h>
#define M 1
#define ctel 5
struct st
 {  char name[100], lastname[100];
    int year, num;
    double mark;
}ST[M],temp;
struct teld{
    char name[40],inicialu[10],adress[100],tel_number[30];
}TELDOV[ctel],temp1;
    int count=0;
int main()
{     //setlocale(LC_ALL,"Rus");
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
      for(int i=0; i<M; i++)
        {   printf("Студент №%d:\n",  i+1);
                printf("\tПрiзвище та iм'я студента:\n");
                //fflush(stdin); //щоб на другому кроці циклу можна було ввести прізище та ім'я
                scanf("%s %s",&ST[i].lastname,&ST[i].name);
                printf("\tрiк народження студента:\n");
                scanf("%d",&ST[i].year);
                printf("\tНомер групи:\n");
                scanf("%d",&ST[i].num);
                printf("\tСереднiй бал успiшностi:\n");
                scanf("%lf",&ST[i].mark);         }
       for(int i=0; i<M; i++)
        {   printf("Студент №%d:\n\tПрiзвище та iм'я студента: %s %s.\n\tРiк народження студента:%d\n\tНомер групи:%d.\n\tСереднiй бал успiшностi:%2.1lf\n",i+1,ST[i].lastname,ST[i].name,ST[i].year,ST[i].num,ST[i].mark);      }
        for(int i=0; i<M; i++)
            if(ST[i].mark<6){
            printf("Студент з балом <6. Його номер %d:\n\tПрiзвище та iм'я студента: %s %s.\n\tРiк народження студента:%d\n\tНомер групи:%d.\n\tСереднiй бал успiшностi:%2.1lf\n",i+1,ST[i].lastname,ST[i].name,ST[i].year,ST[i].num,ST[i].mark);
                count++;}
        if(count==0) printf("\nCтудентiв з середнiм балом < 6 немає!");
        printf("\n\nВiдсортований список по прiзвищах:\n");
        for(int k=0; k<M-1;k++)
        for(int i=0; i<M-1;i++)
            if(strcmp(ST[i].lastname,ST[i+1].lastname)==1)  {
                temp=ST[i+1];
                ST[i+1]=ST[i];
                ST[i]=temp;      }
        for(int i=0; i<M; i++)
        {       printf("Студент №%d:\n\tПрiзвище та iм'я студента: %s %s.\n\tРiк народження студента:%d\n\tНомер групи:%d.\n\tСереднiй бал успiшностi:%2.1lf\n",i+1,ST[i].lastname,ST[i].name,ST[i].year,ST[i].num,ST[i].mark);    }
 
//Второе задание
 
        printf("Завдання 2:\n");
        for(int i=0;i<ctel;i++)
        {printf("Запис №%d:\n\tВведiть прiзвище та iнiцiали:\n",i+1);
        //fflush(stdin);//щоб на першому кроці циклу можна було ввести прізище та ім'я
        scanf("%s %s",TELDOV[i].name,TELDOV[i].inicialu);
        //gets(TELDOV[i].name);
        printf("\tВведiть адресу:\n");
        gets(TELDOV[i].adress);
        printf("\tВведiть номер телефону:\n");
        gets(TELDOV[i].tel_number);     }
        for(int i=0;i<ctel;i++)
        printf("Запис №%d:\n\tПрiзвище та iнiцiали: %s\n\tАдреса: %s\n\tНомер телефону: %s\n",i+1,TELDOV[i].name,TELDOV[i].adress,TELDOV[i].tel_number);
        for(int l=0;l<ctel-1;l++)
            for(int g=0;g<ctel-1;g++)
                if(strcmp(TELDOV[g].tel_number,TELDOV[g+1].tel_number)==1){
                    temp1=TELDOV[g+1];
                    TELDOV[g+1]=TELDOV[g];
                    TELDOV[g]=temp1;}
        printf("Вiдсортований список за номерами телефонiв:\n");
        for(int i=0;i<ctel;i++)
        printf("Запис №%d:\n\tПрiзвище та iнiцiали: %s\n\tАдреса: %s\n\tНомер телефону: %s\n",i+1,TELDOV[i].name,TELDOV[i].adress,TELDOV[i].tel_number);
        //якщо таких записів немає, то вивести відповідне повідомлення?????????
      return 0;
}
Проблема и собственно gets() во второй задании
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
10.10.2011, 02:10
gets() замени на fgets(), так как в fgets() есть ограничение на количество вводимых символов
fgets() не удаляет перевод строки, вместе с fgets() можно использовать sscanf()

устранить пролёт gets() можно так:
Цитата Сообщение от CVB
C
1
scanf("%s %s",TELDOV[i].name,TELDOV[i].inicialu);
C
1
scanf("%s %s%*c",TELDOV[i].name,TELDOV[i].inicialu);
на этих скринах, пролёт происходит из-за того, что по первой %s пошла .3, во вторую %s идёт первое слово, а второе слово идёт на следующие scanf'ы
1
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
10.10.2011, 18:33  [ТС]
Спасибо! Работает! Огромное Вам спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2011, 18:33

Как отсортировать БД по сумме 85 идущих подрят полей?
Здравствуйте. Схема подключения: TADOConnection-&gt;TADOQuery. У меня есть БД длинной в 85 полей, формат названий которых следующий:...

Дано предложение. Найти наибольшее количество идущих подрят пробелов
Дано предложение. Найти наибольшее количество идущих подрят пробелов. помоте плиз

надумал брать 1066МНz, но тут вспомнил, что не вся подрят оперативка процу подходит.
Извыняйте. мож тупой вопрос. просто искал и ничо конкретного не нашол. Вот решил добавить оперативку уже било надумал брать 1066МНz ...

СМА LG WD-80480S не работают исполнительные механизмы, не работают клапана ,мотор,насос
Стиралка LG WD-80480S по включении программы блокирует люк и стоит .Воду не набирает,барабан не крутится,щелкают реле реверса. При...

Материнка AsRock N68C-GS FX - не работают слоты DDR3 2 шт, DDR2 работают нормально
Здравствуйте, Материнка AsRock N68C-GS FX - не работают слоты DDR3 2 шт, хотя предусмотрены. DDR2 работают нормально Процессор TripleCore...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru