【问题标题】:Bad input C vs C++ cin vs scanf输入错误 C vs C++ cin vs scanf
【发布时间】:2013-03-26 20:55:37
【问题描述】:

我是 C 语言的初学者,这是我的问题。在 C++ 中,我会以这种方式查找错误的输入(不是无符号整数):

long double c;
cin >> c;

if (c == (unsigned int) c) {
cout<<"OK";    
}
else
cout<<"NOT OK";

但是,现在学习 C 时,我尝试以相同的方式进行操作,但它不起作用:

long double c;
scanf("%lf", &c);

if (c == (unsigned int) c) {
printf("OK\n");    
}
else
printf("NOT OK\n");    

关于如何修复它的任何建议?我的任务是只使用 scanf 而不使用字符串来做到这一点。我不想输入负数和浮点数。为什么这不起作用?

【问题讨论】:

  • 当您希望输入为unsigned int 时,为什么要扫描到long double
  • @Xymotech “我需要检查负数和浮点数。”
  • 我正在扫描 double 以便当我比较 (c == (unsigned int) c) 时,这里的 c 仍然是浮点数,而不是转换为整数。这样我可以检查输入的数字是否是例如“1.2”而不是“1”。

标签: c++ c scanf cin


【解决方案1】:

转换指令%lf用于扫描doubles。

要扫描long doubles,请使用%Lf,大写L

来自fscanf(7.21.6.2)的规范

l (ell) 指定后面的 d、i、o、u、x、X 或 n 转换说明符适用 类型指针指向long intunsigned long int 的参数; 后面的 a、A、e、E、f、F、g 或 G 转换说明符适用于类型指针指向 double 的参数;或者后面的 c、s 或 [ 转换说明符适用于类型指针指向 wchar_t 的参数。

L 指定后面的 a、A、e、E、f、F、g 或 G 转换说明符适用于类型指针指向 long double 的参数。

【讨论】:

  • 不是 L 代表 long long 和 l 代表 long 吗?它仍然不起作用。泰
  • @user2211796 不,对于long long,您使用%lld(或%lli)和ll 长度修饰符。
  • @user2211796 “它仍然不起作用”,你到底是什么意思,它在多大程度上不起作用?
  • 例如如果我在 C 中 printf("%Lf", c);它显示 2.00000000 并且不正常;如果我用 C++ 计算 c。它显示 2 并转到 OK;
  • 在 C 和 C++ 中输入都是 2。在 C++ 中有效,在 C 中无效
猜你喜欢
  • 2012-02-21
  • 2022-09-29
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
相关资源
最近更新 更多