2016-07-25 3 views
0

Я написал простой код с использованием структурного метода, и в этом коде я беру строку (имя) в качестве ввода, используя цикл для трех студентов. Для 1-й итерации каждая строка в цикле работает так, как должна быть .... но проблема возникает на второй итерации ... на второй итерации scanf пропускает ввод для строки (имя) ...Функция scanf пропускает входной сигнал для цикла в C Программирование

Мой код такой же, как и ниже:

#include<stdio.h> 

struct student_data 
{ 
    char name[5]; 
    int dsd; 
    int dic; 
    int total; 
}; 

void main() 
{ 
    struct student_data s[3]; 


    int i; 

    for(i = 0;i<3;i++) 
    { 
     printf("Enter Name of Student\n"); 
     scanf("%[^\n]",s[i].name);   // Problem occures here in  
             // second iteration 

     printf("\nEnter marks of DSD\n"); 
     scanf("%d",&s[i].dsd); 

     printf("Enter marks of DIC\n"); 
     scanf("%d",&s[i].dic); 


     s[i].total = s[i].dsd+s[i].dic;  

    } 

    printf("%-10s %7s %7s %7s\n ","Name","DSD","DIC","Total"); 
    for(i=0;i<3;i++) 
    { 

     printf("%-10s %5d %6d  %6d\n",s[i].name,s[i].dsd,s[i].dic,s[i].total); 
} 

}

+1

Вы все равно используете 'scanf()'. Вы ДОЛЖНЫ проверять возвращаемое значение, если вы не хотите читать неинициализированную память. И вы этого не хотите, потому что это неопределенное поведение. Проблема с 'scanf()' заключается в том, что очень сложно сделать ее полезной в реальной программе, поэтому она редко используется, тем не менее, это первое, что каждый узнает о [tag: c]. Пожалуйста, прочитайте документацию 'scanf()', вы можете сами выяснить, почему она не работает, и почему это не так. –

+0

Неверный 'scanf()'. используйте 'scanf ("% 4 [^ \ n] ", s [i] .name); вместо этого. –

+0

@AbhishekTandon, если мы используем 'scanf ("% 4 [^ \ n] ", s [i] .name);'. Можем ли мы дать имя более 4 символов? –

ответ

0

Основная проблема с вашим кодом, что вы определили student_data s[2], который представляет собой массив размером два, но в цикле, вы зацикливание for (i=0; i<3; i++), который действителен для массива размер 3. Эти небольшие модификации будут работать нормально:

int main() 
{ 
struct student_data s[2]; // array of size 2 


int i; 

for(i=0; i<2; i++)  // i will have values 0 and 1 which is 2 (same as size of your array) 
{ 
    printf("Enter Name of Student\n"); 
    scanf("%s", s[i].name); 

    printf("\nEnter marks of DSD\n"); 
    scanf("%d", &s[i].dsd); 

    printf("Enter marks of DIC\n"); 
    scanf("%d", &s[i].dic); 

    s[i].total = s[i].dsd+s[i].dic; 

} 

    printf("%-10s %7s %7s %7s\n ","Name","DSD","DIC","Total"); 

    for(i=0; i<2; i++) // same mistake was repeated here 
    { 
     printf("%-10s %5d %6d  %6d\n",s[i].name,s[i].dsd,s[i].dic,s[i].total); 
    } 
return 0; 
} 
+0

Решение thnx ur работало .... но я все еще хочу знать, почему% [^ \ n] пропускал вход от пользователя ?? – rushank27

+0

@ rushank27 взгляните на это сообщение: http://stackoverflow.com/questions/6083045/scanf-n-skips-the-2nd-input-but-n-does-not-why – reshad

Смежные вопросы