为什么当我按下 ctrl + D 时,我的程序在结束之前打印了一些东西?

Why does my program print something before it ends when I press ctrl + D?

所以我写了一个简单的程序,将十进制转换为二进制,只接受正整数。所以像 -2 和 1.1 这样的数字会输出“抱歉,这不是一个正整数。”它会无限地要求用户输入一个数字,直到用户按下 ctrl + D。然而,当我测试它时,它会在程序结束前打印出“对不起...”语句。

这是我的代码:

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

void DecToBin(int userInput){
    int binary[32];
    int i = 0;
    while (userInput > 0) {
        binary[i] = userInput % 2;
        userInput /= 2;
        i++;
    }
    for (int j = i - 1; j >= 0; --j) {
        printf("%d", binary[j]);
    }
}

int main(void) {
    double userDec;
    int temp;

    printf("Starting the Decimal to Binary Converter!\n\n");

    while(!feof(stdin)) {
        printf("Please enter a positive whole number (or EOF to quit): ");
        scanf("%lf", &userDec);
        temp = (int)(userDec);
        if ((userDec > 0) && (temp / userDec == 1)) {
            printf("\n\t%.0lf (base-10) is equivalent to ", userDec);
            DecToBin(userDec);
            printf(" (base-2)!\n\n");
        }
        else {
            printf("\tSorry, that was not a positive whole number.\n");
        } 
    }
    printf("\n\tThank you for using the Decimal to Binary Generator.\n");
    printf("Goodbye!\n\n");
    return 0; 
}

(所有的制表符和换行符都是应该的格式,所以不要注意这一点) 因此,根据我的理解,我的程序在 while 循环中将 ctrl + D 读取为 else。那么,知道这是为什么吗?

您似乎认为 C-d 会触发某种代码中断。比如关键字break。这不是真的。

阅读此 post 以查看按 C-d 时发生的情况:

这不会导致 C 代码中发生任何特殊情况。 scanf 根本不会阅读任何内容。在 scanf 语句之后,代码将照常继续,因此代码将无条件地进入 if 语句。

这也是一件非常严重的事情,因为您将使用 userDec 未初始化的。 scanf return是赋值成功的次数,大家应该经常查看return的值。所以在你的情况下你想要这个:

if(scanf("%lf", &userDec) != 1) { /* Handle error */ }

因为如果scanf没有return1,userDec未分配。

要实现你想要的,只需这样做:

if(scanf("%lf", &userDec) != 1)
    break;