2016-11-10 7 views
-2

私はCプログラミングには比較的新しいので、ユーザーのマークを読み取り、入力されたマークにグレードを割り当てるプログラムをコーディングしようとしています。 私は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; 
} 

私はを押すと、プログラムが終了し、を入力します。 整数が入力された場合、たとえば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バイト)をcharへポインタの大きさではなく、文字列の長さを返します12と入力します。

変更strlen()にまたはより良いまだ、getlineの結果を使用します。区切り文字を含め、 読み取り文字の数を返す)(

成功し

、getlineの()とgetdelimを、は含みません nullバイト( '\ 0')を終了します。

関連する問題