2016-11-10 18 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)返回指针的大小为char(取决于体系结构4或8个字节),该字符串的未长度,以因此,你正在阅读的阵列时的边界的外输入了12

更改为strlen()或更好,但使用的getline结果:)

如果成功,函数getline(和getdelim()返回的字符数 读,包括分隔符,但不包括 终止空字节('\ 0')。