使用scanf输入字符并将其保存在int中会导致未定义的行为吗?

使用scanf输入字符并将其保存在int中会导致未定义的行为吗?,c,C,我正在编写一个代码,我试图输入一个字符而不是整数,结果是“2”,不管我输入的字符是什么,是未定义的行为还是其他什么 守则: #include <stdio.h> int f1(int n); int f2(void); int main(void) { int t; printf("Enter a number: "); scanf("%d", &t); /* print proper message */ t ? f1(t) +

我正在编写一个代码,我试图输入一个字符而不是整数,结果是“2”,不管我输入的字符是什么,是未定义的行为还是其他什么

守则:

#include <stdio.h>
int f1(int n);
int f2(void);

int main(void)
{
    int t;

    printf("Enter a number: ");
    scanf("%d", &t);
    /* print proper message */
    t ? f1(t) + f2() : printf("zero entered.\n");
    return 0;
}

int f1(int n)
{
    printf("%d ", n);
    return 0;
}

int f2(void)
{
    printf("entered.\n");
    return 0;
}
#包括
int f1(int n);
int f2(无效);
内部主(空)
{
int t;
printf(“输入一个数字:”);
scanf(“%d”、&t);
/*打印正确的消息*/
t?f1(t)+f2():printf(“输入零”。\n”);
返回0;
}
整数f1(整数n)
{
printf(“%d”,n);
返回0;
}
int f2(无效)
{
printf(“已输入。\n”);
返回0;
}
当我输入
a
时,结果是“2输入”,当我输入
g
时,结果是“2输入”,当我输入
I,h,k,…
时,结果是相同的。这是什么?

如果
scanf()
遇到基于指定格式字符串无法解析的内容,它只会停止并提前返回。因此它从不向
t
写入任何内容(您只看到调用之前
t
具有的任何不确定值)

要处理此问题,您应该始终检查
scanf

的返回值。如果
scanf()
遇到基于指定格式字符串无法解析的内容,它将立即停止并提前返回。因此它从不向
t
写入任何内容(您只看到调用之前
t
具有的任何不确定值)


要处理此问题,您应该始终检查
scanf

的返回值。正如您所说,使用%d格式的scanf希望您输入一个或多个ascii数字。它停止在非数字字符处扫描输入,因此它从不读取您键入的内容,并且t具有调用scant之前的任何值。

问题是,正如您所说,使用%d格式的scanf希望您输入一个或多个ascii数字。它停止在非数字字符处扫描输入,因此它不会读取您键入的内容,并且t具有调用scant之前的任何值。

您需要检查
scanf
的返回代码。看看:

返回值

这些函数返回成功匹配和分配的输入项的数量,该数量可以少于提供的数量,如果早期匹配失败,甚至可以为零

如果在第一次成功转换或匹配失败发生之前到达输入端,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,设置了流的错误指示器(参见ferror(3)),并设置了errno以指示错误

换句话说,
scanf
不会将任何内容写入
t
,它一直处于未初始化状态

因此,与此相反:

scanf("%d", &t);
试试这个:

int items_matched = scanf("%d", &t);
if (items_matched != 1) {
    printf("bad number entered\n");
    exit(1);
}

您需要检查
scanf
的返回代码。看看:

返回值

这些函数返回成功匹配和分配的输入项的数量,该数量可以少于提供的数量,如果早期匹配失败,甚至可以为零

如果在第一次成功转换或匹配失败发生之前到达输入端,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,设置了流的错误指示器(参见ferror(3)),并设置了errno以指示错误

换句话说,
scanf
不会将任何内容写入
t
,它一直处于未初始化状态

因此,与此相反:

scanf("%d", &t);
试试这个:

int items_matched = scanf("%d", &t);
if (items_matched != 1) {
    printf("bad number entered\n");
    exit(1);
}

这是因为
scanf
无法解析您的输入。由于您使用了
%d
,它希望您输入一个

您必须检查scanf的返回值以避免此类行为:

成功时,函数返回成功填充的参数列表的项数。由于匹配失败、读取错误或到达文件末尾,此计数可以与预期的项目数匹配,也可以小于(甚至为零)

因此:


你不需要你的
f1(t)+f2()
谁很困惑…

这是因为
scanf
无法解析你的输入。由于您使用了
%d
,它希望您输入一个

您必须检查scanf的返回值以避免此类行为:

成功时,函数返回成功填充的参数列表的项数。由于匹配失败、读取错误或到达文件末尾,此计数可以与预期的项目数匹配,也可以小于(甚至为零)

因此:

你不需要你的
f1(t)+f2()
谁很困惑…

格式字符串由一系列指令组成,这些指令描述 如何处理输入字符的序列。如果处理 指令失败,不再读取进一步的输入,,scanf()返回。A. “失败”可以是以下任意一种:输入失败,意思是 输入字符不可用,或匹配失败,这意味着 输入不恰当

在C11标准对扫描功能的描述(7.21.6.4扫描功能)第3节:

scanf函数返回宏EOF的值,如果输入 在第一次转换(如果有)完成之前发生故障。 否则,scanf函数将返回输入项目的数量 已分配,可以小于中提供的、或甚至为零 早期匹配失败事件

重点是我的。因此,正如@oli charlesworth所说,如果有疑问,您应该检查scanf的返回值:)

格式字符串由一系列指令组成,这些指令描述 如何处理输入字符的序列。如果处理 指令失败,不再读取进一步的输入,,scanf()返回。A. “故障”可以是以下任一项:输入故障