2016-11-10 4 views
-2

Я относительно новичок в программировании на языке С, и я пытаюсь закодировать программу, которая читает на отметках пользователя и присваивает оценку введенному знаку. Я использовал функцию getline() для получения пользовательского ввода. Ниже мой код.Значения всегда не совпадают

# include <stdio.h> 
# include <stdlib.h> 
# include <string.h> 
# include <ctype.h> 

int getMark(); 
void display(char grade); 
char convert(int mark); 

int getMark() { 
    do { 
     int marks; 
     char * buffer; 
     char characters; 
     size_t bufsize = 16; 

     buffer = (char *)malloc(bufsize * sizeof(char)); 
     if(buffer == NULL) { 
     perror("Unable to allocate buffer"); 
     exit(1); 
     } 

     printf("Enter the score (0 - 100)\nOr just press the enter key to quit ==> "); 
     characters = getline(&buffer, & bufsize, stdin); 
     int i; 
     long check; 
     for (i = 0; i < sizeof(buffer); i++) { 
      if (buffer[i] == '\n' && i != 0) { 
       buffer[i] = '\0'; 
      } 

      if (isdigit(buffer[i]) || buffer[i] == '\0') { 
       check++; 
      } 
     } 

     if (buffer[0] == '\n') { 
      return -1; 
     } else if (check == strlen(buffer) - 1) { 
      marks = atoi(buffer); 
     } else { 
      printf("Please enter an integer.\n"); 
      continue; 
     } 

     if (marks >= 0 && marks <= 100) { 
      return marks; 
     } else { 
      printf("Sorry, your marks can only be between 0 to 100.\n"); 
      continue; 
     } 

    } while (1); 
} 

void display(char grade) { 
    printf("The grade for the input score is %c \n", grade); 
} 

char convert(int mark) { 
    mark /= 10; 
    char grade; 

    switch(mark) { 
     case 0: 
     case 1: 
     case 2: 
     case 3: 
     grade = 'F'; 
     break; 
     case 4: 
     grade = 'E'; 
     break; 
     case 5: 
     grade = 'D'; 
     break; 
     case 6: 
     grade = 'C'; 
     break; 
     case 7: 
     grade = 'B'; 
     break; 
     case 8: 
     case 9: 
     case 10: 
     grade = 'A'; 
    } 

    return grade; 
} 

int main() { 
    int marks; 
    for (;;) { 
     marks = getMark(); 
     if (marks == -1) { 
      break; 
     } 
     display(convert(marks)); 
    } 

    return 0; 
} 

При нажатии Enter, программа завершается, как и ожидалось. Однако, когда вводится целое число, например 12, выход всегда будет Please enter an integer.

Может ли кто-нибудь помочь мне в этом? Благодаря!

ответ

0
char * buffer; 
... 
for (i = 0; i < sizeof(buffer); i++) { 
    if (buffer[i] == '\n' && i != 0) { 

sizeof(buffer) возвращает размер указателя на символ (4 или 8 байт в зависимости от архитектуры), а не длиной строки, в результате, вы читаете вне пределов массива, 12.

Изменения в strlen() или еще лучше, использовать результат getline:

В случае успеха, GetLine() и getdelim() возвращает количество символов чтения, в том числе разделителя характера, но не включая завершение нулевого байта ('\ 0').