我是否一定要使用“;“putch”;不使用scanf时的函数?

我是否一定要使用“;“putch”;不使用scanf时的函数?,c,windows,C,Windows,我写了这个简单的代码,但它没有给我真正的结果…当我不使用scanf时,我应该肯定地使用“putch”函数吗?…这是我的代码: #include<stdio.h> #include<conio.h> int main() { int x, y, area, p, m, d ; clrscr(); printf("enter a number:"); x = getche(); printf("\nente

我写了这个简单的代码,但它没有给我真正的结果…当我不使用scanf时,我应该肯定地使用“putch”函数吗?…这是我的代码:

#include<stdio.h>
#include<conio.h>
int main()
{
    int x, y, area, p, m, d ;
    clrscr();
    printf("enter a number:");
    x = getche();
    printf("\nenter another number:");
    y = getche();
    area = x * y;
    p = (x + y) * 2;
    clrscr();
    printf("area = %d\t p = %d\n", area, p);
    printf("\npress any key to continue:\n");
    m = getche();
    clrscr();
    printf("\nfinish");
    d = getche();
    return 0;
}
#包括
#包括
int main()
{
int x,y,面积,p,m,d;
clrsc();
printf(“输入一个数字:”);
x=getche();
printf(“\n输入另一个数字:”);
y=getche();
面积=x*y;
p=(x+y)*2;
clrsc();
printf(“区域=%d\t p=%d\n”,区域,p);
printf(“\n按任意键继续:\n”);
m=getche();
clrsc();
printf(“\n完成”);
d=getche();
返回0;
}

您必须清除的最大障碍是理解C语言中的所有用户输入都是字符输入。您正在读取ASCII值,请参阅。如果在作为输入读取的ASCII值中有数字,则必须将数字转换为数值

在您的情况下,输入
'2'
(具有ASCII值
50
)和
'3'
(具有ASCII值
51
),然后使用字符的ASCII值而不是数字值执行计算,例如

    area = x * y;       /* perform calculations */
    p = (x + y) * 2;
最后得到:
area=2550p=202
,因为您的计算是用
'2'
'3'
50
51
)的ASCII值来完成的,而不是整数
2
3

有几种方法可以解决这个问题。建议将用户输入的整行内容读取到缓冲区(字符数组)中,以便读取整行内容(包括任何散乱或无关字符),并从该行解析所需的值。您可以使用
fgets()
sscanf()
验证两者的返回。例如:

#include <stdio.h>

#define MAXC 1024       /* if you need a constant, #define one (or more) */
...
    fputs ("enter a number (x): ", stdout);     /* prompt */
    /* read user-input and convert string of digits to integer value */
    if (!fgets(buf, MAXC, stdin) || sscanf (buf, "%d", &x) != 1) {
        fputs ("error: invalid x input.\n", stderr);
        return 1;
    }
    
    fputs ("enter a number (y): ", stdout);     /* prompt */
    /* read user-input and convert string of digits to integer value */
    if (!fgets(buf, MAXC, stdin) || sscanf (buf, "%d", &y) != 1) {
        fputs ("error: invalid y input.\n", stderr);
        return 1;
    }
注意:最终预处理器条件仅检查是否在windows上编译,如果是,则包括最终的
getchar()
,因此终端窗口保持打开状态,直到键入字符并返回)

示例使用/输出

$ ./bin/area_perimeter
enter a number (x): 2
enter a number (y): 3

area = 6        p = 10
无关输入或意外输入呢

$ ./bin/area_perimeter
enter a number (x): 2 is the value for x for my project
enter a number (y): 3 is the value for y

area = 6        p = 10
使用ASCII值导致的错误:

$ ./bin/area_perimeter
enter a number (x): 50
enter a number (y): 51

area = 2550      p = 202
因为没有使用
conio.h
,而且只使用C标准函数,所以您的代码是100%可移植的。仔细检查一下,如果有问题请告诉我

当我不使用scanf时,我是否应该使用“putch”功能

不,您可能会坚持使用标准的C函数。读看

但是,您应该阅读C编译器(可能是一些…)和调试器(例如…)的文档


也要知道,在2020年。因此,您可能会感兴趣。

您的输入、预期输出和实际输出是什么?我不认为即使未使用
scanf()
,也必须使用标准中没有的
putch()
。为什么您认为在不使用
scanf()
时一定要使用
putch()
函数这将
x
设置为您按下的第一个键的字符代码,这很可能不是您想要的。@MikeCAT这是我的输入:x=2 y=3,输出:area:2550 p=202这是一个详细的答案!为了便于理解,我将“然后您使用ASCII值而不是数字值执行计算”改为“然后您使用ASCII值而不是字符的数字值执行计算”。这一点很好。我会的。如果您发现其他类似的,请随意进行编辑。我对此没有问题。@DavidC.Rankin我几乎理解了为什么输出是正确的…我还需要做更多的工作…而且我的问题是完全错误的!!谢谢你的指导…@Benjamin-我们都是从同一个级别开始编程的,我们都犯过同样的错误——关键是要从中吸取教训
:)
$ ./bin/area_perimeter
enter a number (x): 50
enter a number (y): 51

area = 2550      p = 202