C ++中的格式说明符

问题描述 投票:0回答:2

我正在尝试弄清C ++编译器的行为。在这里,我故意犯了两个错误:

  1. 忘记了%ld中的scanf格式说明符,只写了%
  2. printf中添加未知格式说明符,对于%l数据类型写%ld而不是long
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    // Complete the code.
    int a; long b; char c; float d; double e;
    scanf("%d % %c %f %lf", &a, &b, &c, &d, &e);
    printf("%d \n%l \n%c \n%f \n%lf", a, b, c, d, e);
    return 0;
}

上面的代码段已成功编译并显示警告。为什么没有为未知/缺少C ++格式说明符引发错误?它是如何编译的?

输出:Input data and strange output after mistakes

c++ gcc compiler-warnings
2个回答
0
投票

因为%不是未知的格式说明符,而是-百分号,后跟(一个或多个)空格。在输入流中搜索百分号,如果没有出现预期的百分号,它将停止匹配,并返回已经分配的字段数-一个。

显然,这很少是编码人员的意图,因此编译器会对此发出警告。更清楚地说出您想要真实百分号的方法是使用%%。编译器发出的百分比和空白气味就像您犯了一个错误一样,但是在形式上并没有错。因此,这只是一个警告。


0
投票

即使编译器也不需要告诉您(谢天谢地!)。格式字符串和参数列表之间的不匹配是未定义的行为。

scanf中,不带说明符的%只是字面上的百分号,因此它不是无效的。

© www.soinside.com 2019 - 2024. All rights reserved.