为什么当我按下 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;
所以我写了一个简单的程序,将十进制转换为二进制,只接受正整数。所以像 -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;