虽然 GetChar != EOF 不一致地终止

While GetChar != EOF terminating inconsistently

我有这两段代码,它们的目的都是为了获得一些用户输入,制作一个加密脚本。

int keyPrompt(){
  /* this prompts the user for the Caesar encryption key */
  int c;
  printf("Enter key value between 1-9: ");
  while((c=getchar()) != EOF && c != '\n'){
    return c;
  }
}

int cryptPrompt(){
  /* this asks the user whether they want to encrypt or decrypt */
  int d;
  printf("Do you want to encrypt or decrypt?(E/D): ");
  while((d=getchar()) != EOF && d != '\n'){
    /*
    if(d == 'E'){
      return 1;
    }
    else if (d == 'D' ){
      return -1;
    }
    */
    return d;
  }
}

我遇到的问题是,当我 运行 文件时,第一个 while 循环的行为与我预期的一样:我输入一个值,按回车键,它会转到下一行。对于第二个 while 循环,当它执行该函数时,它会跳过询问用户输入并直接转到下一行,而不存储任何 return 值。

知道它为什么这样做吗?

考虑这段代码的作用:

int keyPrompt(){
  /* this prompts the user for the Caesar encryption key */
  int c;
  printf("Enter key value between 1-9: ");
  while((c=getchar()) != EOF && c != '\n'){
    return c;
  }
}

打印提示后,读取一个输入字符。如果该字符是 EOF 或换行符,它会退出循环并离开函数的末尾(没有 return,如果不忽略 returned 值,则会导致未定义的行为)。如果它不是 EOF 或换行符,则它 return 是字符。

while 循环在任何情况下都不会真正循环。

考虑一下如果您调用此代码并输入一个键+换行符会发生什么。密钥将被读取并 returned,换行符将留在输入缓冲区中。现在考虑如果您像这样调用另一个函数会发生什么——它首先读取的是 keyPrompt 函数遗留下来的换行符...