未使用scanf时是否必须用putch?C语言代码运行异常求助
嘿,先直接回答你的核心问题:不使用scanf的情况下,完全不需要必须用putch函数!putch是用来输出单个字符的函数,和你要实现的输入功能没有强制绑定关系——你有很多其他输入方式可以选,比如getchar、getch(注意和getche的区别),甚至可以读取整行输入后再解析,这些都和putch没关系。
不过看你的代码,运行结果不对的根源其实不是输入函数的选择,而是你对getche()的返回值理解错了,我来帮你捋清楚:
你的代码问题所在
getche()返回的是你输入字符的ASCII码值,比如你输入数字'1',它返回的是整数49,而不是你想要的数值1。所以你计算x * y的时候,其实是在用两个字符的ASCII码相乘,结果自然和预期不符。
举个例子:如果你输入'2'和'3',x会是50,y是51,area就变成50*51=2550,而不是正确的6。
快速修正方案
只需要把getche的结果减去字符'0'的ASCII值,就能把输入的字符数字转换成对应的整数:
x = getche() - '0'; y = getche() - '0';
因为字符'0'到'9'的ASCII值是连续的(48到57),减去'0'(48)后就能得到0-9的整数。
不过还要注意两个点:
conio.h是非常老旧的DOS头文件,现代编译器(比如GCC、Clang)大多不支持,如果你用的是现代开发环境,建议换成标准库函数,比如用getchar()代替getche()(不过getchar需要按回车才会返回输入)。clrscr()也是非标准函数,现代系统可以用系统命令清屏:Windows用system("cls"),Linux/macOS用system("clear"),记得要包含stdlib.h头文件。
修正后的代码示例(适配现代环境):
#include<stdio.h> #include<stdlib.h> int main() { int x, y, area, p; system("cls"); // Windows清屏,Linux/macOS换成system("clear") printf("enter a number:"); x = getchar() - '0'; getchar(); // 吃掉输入后的回车符,避免影响下一次输入 printf("\nenter another number:"); y = getchar() - '0'; getchar(); area = x * y; p = (x + y) * 2; system("cls"); printf("area = %d\t p = %d\n", area, p); printf("\npress enter to continue:\n"); getchar(); system("cls"); printf("\nfinish"); getchar(); return 0; }
进阶:支持多位数输入
如果需要输入大于9的数字,上面的单字符转换就不够用了,你可以写一个简单的函数来读取并转换多位数:
#include<stdio.h> int read_integer() { int num = 0; char c; // 循环读取字符,直到遇到回车或非数字字符 while((c = getchar()) != '\n' && c >= '0' && c <= '9') { num = num * 10 + (c - '0'); } return num; } // 然后在main里调用: // x = read_integer(); // y = read_integer();
再回到你的原始问题
总结一下:不用scanf的话,输入方式有很多选择——比如getchar读取单个字符、fgets读取整行后解析、甚至直接操作标准输入的文件描述符,完全不需要用到putch。putch只是用来输出单个字符的,和输入逻辑没有必然联系哦。
内容的提问来源于stack exchange,提问作者Benjamin

