为什么我的程序在这种特殊情况下打印出此消息两次?

时间:2013-12-07 01:22:16

标签: c printf

我编写了一个程序,它将根据您输入的命令打印输出。所有功能都正确/所有输出都是正确的。

我正在尝试提供检查以查看 if:

  1. 文件格式错误(如果是,退出程序)
  2. 用户输入的搜索命令有不同的语法(如果是,请返回命令提示符)但是,我不太确定如何实现这些检查!
  3. 我遇到的另一个问题是当我输入“KK”或“RR”或任何不是指定命令的东西时,它会打印出“输入命令或输入'Q'退出消息:”多少次我输入了一个角色。 (即如果我放KKK,它将打印出该消息三次;如果我放KK,它将打印出两次消息)

    这是用户输入的命令应该是什么样的:
    注意: 用户未输入"</>"符号。

    S <lastname> 
    T <lastname>
    G <number>
    L <number>
    Q
    

    这是我在main中的代码:

    int main() {
       studentType s[MAX_STUDENTS];
       teacherType t[MAX_TEACHERS];
       char input[MAX_NAME];
       int numS, numT;
       char command;
       FILE * out;
    
       numS = readStudentInfo(s); /* Number of students equals size of array. */
       numT = readTeacherInfo(t); /* Number of teachers equals size of array. */
    
    
       if (numS > MAX_STUDENTS) { /*If # of s exceed maximum, quit program. */
          printf("Number of student exceeds the maximum number allowed.\n");
          return 0;
       }
    
       if (numT > MAX_TEACHERS) { /* If # of t exceed maximum, quit program. */
          printf("Number of teachers exceeds the maximum number allowed.\n");
          return 0;
       }
    
       out = fopen("log.out", "w");
    
    
       while (command != 'Q') {
          printf("Enter command or enter 'Q' to quit:\n");
          scanf(" %c", &command);
    
          if (command == 'S') {
             scanf("%s", input);
             fprintf(out, "-->%c %s\n", command, input);
             getStudentInfo(s, t, input, numS, numT, out);
          }
    
          if (command == 'T') {
             scanf("%s", input);
             fprintf(out, "-->%c %s\n", command, input);
              findStudents(s, t, input, numS, numT, out);
          }
    
          if (command == 'G') {
             scanf("%s", input);
             fprintf(out, "-->%c %s\n", command, input);
             getGradeList(s, t, atoi(input), numS, numT, out);
          }
    
          if (command == 'L') {
             scanf("%s", input);
             fprintf(out, "-->%c %s\n", command, input);
             findGradeTeachers(s, t, atoi(input), numS, numT, out);
          }
       }
    
       if (command == 'Q') {
          fprintf(out, "-->%c\n", command);
          fclose(out);
          return 0;
       }
    
       return 0;
    }
    

1 个答案:

答案 0 :(得分:1)

[编辑] 建议免除scanf(" %c", &command);和各种scanf("%s", input);。而是使用fgets() sscanf()如下。其他简化可能,但这是为了开始OP。

char buf[MAX_NAME + 4];
int number;
while (fgets(buf, sizeof buf, stdin) != NULL) {
  if (sscanf(buf, "S %s", input) == 1) {
    fprintf(out, "-->S %s\n", input);
    getStudentInfo(s, t, input, numS, numT, out);
  }
  else if (sscanf(buf, "G %d", &number) == 1) {
    fprintf(out, "-->G %d\n", number);
    getGradeList(s, t, number, numS, numT, out);
  }
  ...
  else if (buf[0] == 'Q') {
    fprintf(out, "-->Q\n");
    break;
  }
  else {
    fprintf(out, " X Bad command '%s'\n", buf);
    fclose(out);
    exit(1);
  }
}
fclose(out);

输入“KKK”后,scanf(" %c", &command)会读取第一个KK与任何命令都不匹配。 while循环出现,打印提示并消耗第二个K。同样的事情发生在第3 K消耗之前。

while (command != 'Q') {
  printf("Enter command or enter 'Q' to quit:\n");
  scanf(" %c", &command);
  if (command == 'S') {
     ...
  }
  ...
}

[编辑]

的简单方法

您还有UB,因为char command;没有为command分配值 - 可以Q,程序会立即退出。建议使用do { ... } while ()循环。