Как использовать gets в цикле - C (СИ)

  1. Всем привет! Подскажите, пожалуйста, в чем дело.Странно вводятся Фамилии и инициалы второго и последующих студентов.(на скриншоте видно)C1 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 #include<stdio.h> #include<strings.h> struct STUDENT {  char NAME[30];  int NUMBER;  int USP[5];//успеваемость } mas[3]; int main (void) {  int i,i_usp;  for(i=0;i<3;i++)   {    printf("Введите фамилию и инициалы\n");    gets(mas[i].NAME);    printf("Введите номер группы\n");    scanf("%d", &mas[i].NUMBER);    printf("Введите оценки через пробел и нажмите Enter\n");    for(i_usp=0;i_usp<5;i_usp++)     scanf("%d", &mas[i].USP[i_usp]);   }  for(i=0;i<3;i++)   {    printf("Фамилия и инициалы=%s    Номер группы=%d     ", mas[i].NAME, mas[i].NUMBER);    printf("Оценки=");    for(i_usp=0;i_usp<5;i_usp++)     printf("%d ",mas[i].USP[i_usp]);     printf("\n");   } }Огромное спасибо


textual

Код:

#include <stdio.h>
#include <string.h>
 
struct STUDENT
{
    char NAME[30];
    int NUMBER;
    int USP[5];
} mas[3];
 
int main(void)
{
    int i,i_usp;
    for(i=0;i<3;i++)
    {
        printf("Введите фамилию и инициалы\n");
        gets(mas[i].NAME);
        printf("Введите номер группы\n");
        scanf("%d", &mas[i].NUMBER);
        printf("Введите оценки через пробел и нажмите Enter\n");
        for(i_usp=0;i_usp<5;i_usp++)
            scanf("%d", &mas[i].USP[i_usp]);
        getchar();
    }
    for(i=0;i<3;i++)
    {
        printf("Фамилия и инициалы=%s    Номер группы=%d     ", mas[i].NAME, mas[i].NUMBER);
        printf("Оценки=");
        for(i_usp=0;i_usp<5;i_usp++)
            printf("%d ",mas[i].USP[i_usp]);
        printf("\n");
    }
    return 0;
}


Похожие ответы
  1. В общем, я запутался. Вот задание. Необходимо разработать программу согласно варианту задания. При реализации использовать указатели на функции и (или) массивы указателей на функции. -------------------------------------------------- Дан список записей типа ТОВАР (размер списка и его элементы вводятся пользователем). Упорядочить список по любому из полей в любом направлении. Поле и направление выбирает пользователь. В функцию сортировки должен передаваться указатель на функцию сравнения двух элементов. (20 баллов). ТОВАР: - наименование товара (строка 15 символов); - единицы измерения (строка 5 символов); - цена (вещественное число с двумя знаками после запятой); - количество (целое положительное число). То, что накаляканоC1 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 #include #include #include #include #include typedef struct {     char  name[16];     char  mesr[6];     double price;     int count; }Good; typedef Good *Ptr; typedef int (*Pfun)( void *, void * ); int cmpNM ( void *, void * ); int cmpCNT( void *, void * ); void sortbychoice( Ptr , int, size_t, void (*), Pfun ); void swap ( Ptr , Ptr ); int main( int argc, char *argv[ ] ) {     //printf( "%d",  offsetof( Good, count) );     int d = 0, count;     printf( "Enter count of lists: ");     while( !d || count <= 0)     {         d = scanf( "%d", &count );         if( !d || count <= 0 ) { while( getchar( ) != '\n' ); printf( "Repeat: "); }     }     fflush( stdin );     int i;     Ptr list = (Good*)calloc( count, sizeof(Good));     for( i = 0; i < count; i++ ) { printf( "Name|Measure|Price|Count: " ); scanf( "%s%s%lf%d", list[i].name, list[i].mesr, &list[i].price, &list[i].count ); while( getchar( ) != '\n' );}       //       //sortbychoice( list, count, sizeof(char)*15, list[i].name, cmpNM );     sortbychoice( list, count, offsetof( Good, count ), &list[i].count, cmpCNT);     for( i = 0; i < count; i ++ ) printf( "Name: %s | Measure: %s | Price: %3.2lf | Count: %03d\n", list[i].name, list[i].mesr, list[i].price, list[i].count );     system( "pause" );     getch( );     return 0; }   void swap ( Ptr arg1, Ptr arg2 ) {    Good temp = *arg1;    *arg1 = *arg2;    *arg2 = temp;    return; } int cmpNM( void * arg1, void * arg2 ) {     if( strcmp( (char*)arg1, (char*)arg2 ) == 1 ) return 1;     else return 0; } int cmpCNT( void * arg1, void *arg2 ) {     if(*((int*)arg1) > *((int*)arg2)) return 1;     else return 0; } void sortbychoice ( Ptr good, int count, size_t size, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char* )arr;      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*size),  (void*)( ar + j * size )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }Добавлено через 3 минуты дело в том, что я не могу понять, как мне обращаться к началу памяти одного и того же поля в массиве структур. Делал такое с обычными массивами, вроде всё работало. Вот как делал:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void SortArray( void *array, unsigned num, size_t size, int (*fun)(void *arg1, void *arg2), void (*fun1)( void *arg1, void *arg2)) {     int i, j;     int imin, imax;     char *ptr = (char* )array; // указатель на начало памяти массива     for( i = 0; i < num - 1; i += 2 )     {         imin = i;         for( j = i + 2; j < num; j += 2 )         if( fun( (void*)(ptr + imin*size), (void*)(ptr + j*size)) > 0 ) imin = j;                 fun1( ptr + i*size, ptr + imin*size);// смещение указателя на size бацтов массив     }  for( i = 1; i < num - 1; i += 2 )     {         imax = i;         for( j = i + 2; j < num; j += 2 )         if( fun( (void*)(ptr + imax*size), (void*)(ptr + j*size)) < 0 ) imax = j;                 fun1( ptr + i*size, ptr + imax*size );// смещение указателя на size бацтов массив     } }Добавлено через 32 минуты Сообщение от Michail97 //sortbychoice( list, count, sizeof(char)*15, list[i].name, cmpNM ); * * sortbychoice( list, count, offsetof( Good, count ), &list[i].count, cmpCNT); На эти строки на намекать. ИсправилДобавлено через 3 минуты В общем, для сортровки по кол - ву работает вроде.C1 2 3 4 5 6 7 8 9 10 11 12 void sortbychoice ( Ptr good, int count, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char * )arr; // указатель на начало памяти выбранного поля аргумента arg      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*sizeof( Good)),  (void*)( ar + j * sizeof(Good) )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }Сейчас попробую со строками также провернутьДобавлено через 9 минут В общем, пока работает. Если найдёте грабли ещё, укажите, пожалуйста. C1 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 #include #include #include #include #include typedef struct {     char  name[16];     char  mesr[6];     double price;     int count; }Good; typedef Good *Ptr; typedef int (*Pfun)( void *, void * ); int cmpNM ( void *, void * ); int cmpCNT( void *, void * ); void sortbychoice( Ptr , int, void (*), Pfun ); // для 1 - ого аргумента необходимо передать 2 - ой указатель void swap ( Ptr , Ptr ); int main( int argc, char *argv[ ] ) {     //printf( "%d",  offsetof( Good, count) );     int d = 0, count;     printf( "Enter count of lists: ");     while( !d || count <= 0)     {         d = scanf( "%d", &count );         if( !d || count <= 0 ) { while( getchar( ) != '\n' ); printf( "Repeat: "); }     }     fflush( stdin );     int i;     Ptr list = (Good*)calloc( count, sizeof(Good));     for( i = 0; i < count; i++ ) { printf( "Name|Measure|Price|Count: " ); scanf( "%s%s%lf%d", list[i].name, list[i].mesr, &list[i].price, &list[i].count ); while( getchar( ) != '\n' );}       //       sortbychoice( list, count,list[0].name, cmpNM );     //sortbychoice( list, count, &list[0].count, cmpCNT);     for( i = 0; i < count; i ++ ) printf( "Name: %s | Measure: %s | Price: %3.2lf | Count: %03d\n", list[i].name, list[i].mesr, list[i].price, list[i].count );     system( "pause" );     getch( );     return 0; }   void swap ( Ptr arg1, Ptr arg2 ) {    Good temp = *arg1;    *arg1 = *arg2;    *arg2 = temp;    return; } int cmpNM( void * arg1, void * arg2 ) {     if( strcmp( (char*)arg1, (char*)arg2 ) == 1 ) return 1;     else return 0; } int cmpCNT( void * arg1, void *arg2 ) {     if(*((int*)arg1) > *((int*)arg2)) return 1;     else return 0; } void sortbychoice ( Ptr good, int count, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char * )arr;      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*sizeof( Good)),  (void*)( ar + j * sizeof(Good) )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }

  1. Определить, можно ли введенную строку использовать в качестве идентификатора переменной.

  1. к примеру имеется .с исходник, где прописаны:C1 2 3 4 #define Исходник SW_DOUT_PIN = 1;           //установить логическую единицу на этой ножке SW_DOUT_PIN = 0;           //установить логический ноль на этой ножке SW_DOUT_PIN = 1;           //снова установить логическую единицу на этой ножкев первом хидере SW_DOUT_PIN определяется как:C1 2 3 .h #define хидер1 #define SW_DOUT_PIN PORTA5     //дефайн определяет 5 ножку микроконтроллерано так же мне нужно, чтобы в другой момент сишный исходник видел другой хидер в котором дефайн с таким же именем указывал бы на другую ножку, скажем вот так:C1 2 3 .h #define хидер2 #define SW_DOUT_PIN PORTA3     //дефайн определяет 3 ножку микроконтроллераТо есть чтобы на этапе компиляции препроцессор на основе одного хидера подставил где-то код:C1 2 3 PORTA5 = 1; PORTA5 = 0; PORTA5 = 1;а где-то в другом месте программы на основе другого хидера по тем же строчкам из исходника подставил другой код:C1 2 3 PORTA3 = 1; PORTA3 = 0; PORTA3 = 1;Это возможно? если я что-то непонятно написал, скажите мне, я постараюсь объяснить лучше, а то у меня уже ночь и я дико устал)

  1. C1 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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 /* /* Написать программу, которая показывает реальное время в выбранных городах мира. Программа должна уметь просчитывать разницу времени для двух произвольных городов мира, которые выбрал пользователь. Должна быть на написана  на чистом C (си). */     #include "stdafx.h" #include #include < stdio.h >  // Для printf #include < time.h >   // Для time, ctime #include   #include #include #include   int _tmain(int argc, _TCHAR* argv[]) {       setlocale(LC_ALL, "Russian");     char citi[20];     char citi2[20];     int hour1, hour2, hour3,i;       time_t rawtime;     struct tm * ptm;     time(&rawtime);   // определить текущую дату в секундах     ptm = gmtime(&rawtime);  // дата и время в формате GMT           // Переменная для сохранения текущего времени     long int ttime;     // Считываем текущее время     ttime = time(NULL);     // С помощью функции ctime преобразуем считанное время в     // локальное, а затем в строку и выводим в консоль.     printf("Время: %s\n", ctime(&ttime));           //24 строки города  по 20 символов     char words[24][20] = {         //00         "Исламабад",         //01         "Дакка",         //02         "Джакарта",         //03         "Сингапур",         / 04         "Сеул",         //05         "Аганья",         //06         "Канберра",         //07         "Маджуро",         //08         "Пагопаго",         //09         "Веллингтон",         //10         "Анкоридж",         //11         "Адамстаун",         //12         "Калгари"         //13         "Манагуа",         //14         "Панама",         //15         "Сан-Хуан",         //16         "Асунсьон",         //17         "Бразилия",         //18         "Прая",         //19         "Рабат",         //20         "Тунис",         //21         "Киев",         //22         "Москва",         //23         "Баку"     };     //Вывод массив горов на консоль     for ( i = 0; i<23; i++)     {         printf("Порядковый номер города равен часовому поясу %s\n", words[i]);     }     //Введите название города     printf("Введите название города  %s\n");       scanf("%s", citi);       printf("Введите название другого города  %s\n");     scanf("%s", citi2);     //Поиск в массиве строк     for (i = 0; i<23; i++)     {         if (citi == words[i])         {             hour1 = i;         }         if (citi2 == words[i])         {             hour2 = i;         }     }     //Считаем разницу в часах     hour3 = abs(hour2 - hour1);     printf("Разница во времени между обраными городами %d\n", hour3);       //Реальное время для избранных городов     printf("Реальное время для города  %s\n", citi1);     printf("%d\n “, (ptm->tm_hour + hour1) % 24, ":", ptm->tm_min;       printf("Реальное время для города  %s\n", citi2);     printf("%d\n ", (ptm->tm_hour + hour2) % 24, ":", ptm->tm_min);       system("pause");     return 0; }

  1. Описать функцию Max2(A,B) вещественного типа, находящую максимальное из двух вещественных чисел A и B. С помощью этой функции, найти максимальное из пар чисел A и B, A и C, A и D, если даны числа A, B, C, D

  1. Добрый день, почему у меня в коде не срабатывает функция gets? Она просто пропускается. Заранее спасибо. C1 2 3 4 5 6 7 8 9 10 void keyinfile() {     char keyname[256];     printf("\nType the name of key file with extension");     gets_s(keyname);                           //не срабатывает     FILE * ptr = fopen(keyname, "wb");     for (int i = 0; key[i] != '\0'; i++)         fprintf(ptr, "%c", key[i]);     fclose(ptr); }

  1. Изучаю Си по книге. В главе "Безопасное программирование на С" написано, что нежелательно использовать printf с одним аргументом. C1 printf("Welcome");А если и использовать print,то только такC1 printf("%s","Welcome");Что такого опасного таится тут?

  1. если как я понял C++ полностью работает с кодом C.

  1. Нужно написать программу, которая вводит строку текста и использует стек для печати строки в обратной последовательности.

  1. При использовании функции gets выдаёт ошибку "The function 'gets' is marked as deprecated." Программа работает, но хотелось бы узнать в чём дело.