如果在执行scanf("%d",n)时用户输入的是字母怎么办?

HashCodeWithJava 2002-12-19 02:31:25
比如
int n;
scanf("%d",n);
但是如果用户输入的是一窜字母,我怎么来解决这个错误?
...全文
2960 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
HashCodeWithJava 2002-12-22
  • 打赏
  • 举报
回复
好,就到这里.
给分了!
quickball 2002-12-20
  • 打赏
  • 举报
回复
scanf("%s", string_ptr);
celeil 2002-12-20
  • 打赏
  • 举报
回复 1
如果用户输入的是字母,那么scanf的返回值为0。你判断scanf的返回值就OK了。
anghna 2002-12-20
  • 打赏
  • 举报
回复
up
HashCodeWithJava 2002-12-20
  • 打赏
  • 举报
回复
的确是,我也是遇到这样的问题
snjsj 2002-12-19
  • 打赏
  • 举报
回复 2
是的,scanf会死循环,我刚学c的时候发生过很多次,至今已经两年多过去了,难以忘怀。这方面c远没c++好。
15962 2002-12-19
  • 打赏
  • 举报
回复
不要用scanf了,用 getch(), 然后再转化这个字符串到数字.
如果其中有非数字,就报错。
: myblind(盲人) (的办法很好阿,又简单
gq00001 2002-12-19
  • 打赏
  • 举报
回复
up
J2eeLearner 2002-12-19
  • 打赏
  • 举报
回复
举个例子,假设你有如下的代码,从std::cin读取一个整数:


#include <iostream>

int main()
{
std::cout << "Enter numbers separated by whitespace (use -1 to quit): ";
int i = 0;
while (i != -1) {
std::cin >> i; // 不良的形式 — 见如下注释
std::cout << "You entered " << i << '\n';
}
}
该程序没有检查键入的是否是合法字符。尤其是,如果某人键入的不是整数(如“x”),std::cin流进入“失败状态”,并且其后所有的输入尝试都不作任何事情而立即返回。换句话说,程序进入了死循环;如果42是最后成功读到的数字,程序会反复打印“You entered 42”消息。

检查合法输入的一个简单方法是将输入请求从 while 循环体中移到 while 循环的控制表达式,如:

 

#include <iostream>

int main()
{
std::cout << "Enter a number, or -1 to quit: ";
int i = 0;
while (std::cin >> i) { // 良好的形式
if (i == -1) break;
std::cout << "You entered " << i << '\n';
}
}
这样的结果就是当你敲击end-of-file,或键入一个非整数,或键入 -1 时, while 循环会退出。

(自然,你也可以不用break,而将while循环表达式while (std::cin >> i)改为((std::cin >> i) && (i != -1)),但这不是本FAQ的重点,本 FAQ 处理iostream,而不是一般的结构化编程指南。)

[ Top | Bottom | Previous section | Next section ]


--------------------------------------------------------------------------------


[15.3] 那个古怪的while (std::cin >> foo)语法如何工作?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]
“古怪的 while (std::cin >> foo)语法”的例子见前一个FAQ。

(std::cin >> foo)表达式调用了适当的operator>>(例如,它调用了左边带有std::istream参数以及,如果的类型是int,并且右边有一个int&的operator>>)。std::istream operator>>函数按惯例地返回左边的参数,在这里,它返回std::cin。下一步编译器注意到返回的 std::istream处于一个布尔型的上下文中,因此编译器将std::istream转换为一个布尔值。

编译器调用一个称为std::istream::operator void*()的成员函数来将std::istream转换成布尔。它返回一个被转换成布尔的void*指针(NULL成为false,任何其他的指针成为true)。因此在这里,编译器产生了std::cin.operator void*()的调用,就如同你象(void*) std::cin这样显式地强制类型转换。

如果stream处于良好状态,那么转换算符operator void*()返回非指针,如果处于失败状态,则返回 NULL。例如,如果读了太多次(也就是说,已经处于end-of-file),或实际输入到流的信息不是foo的合法类型(如,如果 foo是一个int,而数据是一个“x”字符),流会进入失败状态并且转换算符会返回NULL。

operator>>不是简单地返回一个bool(或 void*)以支出是否成功或失败的原因是为了支持“级联”语法:


std::cin >> foo >> bar;
operator>>是向左结合的,意味着如上的代码会解释为:


(std::cin >> foo) >> bar;
换句话说,如果我们将operator>>变为一个普通的函数名称,如readFrom(),将变为这样的表达式:


readFrom( readFrom(std::cin, foo), bar);
我们总是从最内部开始计算表达式。因为 operator>>的左结合性,就成了最左边表达式std::cin >> foo。该表达式返回std::cin (更合适的,他返回一个它左边参数的引用)给下一个表达式。下一个表达式也返回(一个引用)给std::cin,但第二个引用被忽略了,因为它是这个“表达式语句”的最外边的表达式了。

[ Top | Bottom | Previous section | Next section ]


--------------------------------------------------------------------------------


[15.4] 为何我的输入处理会超过文件末尾?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]
因为只有在试图超过文件末尾后,eof标记才会被设置。也就是,在从文件读最后一个字节时,还没有设置 eof 标记。例如,假设输入流映射到键盘——在这种情况下,理论上来说,C++库不可能预知到用户所键入的字符是否是最后一个字符。

如,如下的代码对于计数器 i 会有“超出 1”的错误:


int i = 0;
while (! std::cin.eof()) { // 错误!(不可靠)
std::cin >> x;
++i;
// Work with x ...
}
你实际需要的是:


int i = 0;
while (std::cin >> x) { // 正确!(可靠)
++i;
// Work with x ...
}
sjd163 2002-12-19
  • 打赏
  • 举报
回复 1
输入字符串,然后分析字符串,输入什么都可以。
HashCodeWithJava 2002-12-19
  • 打赏
  • 举报
回复
哦,我打错了
是scanf("%d",&n);
xzhuang 2002-12-19
  • 打赏
  • 举报
回复
不管怎么弄都会崩溃!
scanf("%d",n);?????
why not scanf("%d", &n);???
tqtang 2002-12-19
  • 打赏
  • 举报
回复
只要加一个if语句就可以了!!!!
vsfan 2002-12-19
  • 打赏
  • 举报
回复
这是程序中不可避免的函数么?不是的话用cin之类不好么?
dingzhaofeng 2002-12-19
  • 打赏
  • 举报
回复
给操作员一个醒目的提示也很重要呀!
kingofvc 2002-12-19
  • 打赏
  • 举报
回复
Bandry(菜鸟-舍我其谁)
我来帮楼主回答一次吧
你使用过这个函数然后输入字符没有?
这种情况下程序就会进入死循环
一方面程序需要你输入数字 另一方面缓存中的字符没有清空 所以每次等待输入得到字符 然后又等待输入 程序就此崩溃了
俞庆平 2002-12-19
  • 打赏
  • 举报
回复
不信你可能试试
输入78,78+256,78+多个256,输出均为'N'.
#include <stdio.h>
#include <conio.h>

int main(int argc, char* argv[])
{
char n;
scanf("%d",&n);
printf("%c",n);
getch();
return 0;
}
俞庆平 2002-12-19
  • 打赏
  • 举报
回复
以上说法或源码都有部分问题:
scanf("%d",&n);这样才可能当作输入,但如果
n是char 型,在这里不会出错,会将char当作int型来赋值,
如果输入大于256设为x,则会发生溢出,n中保留x%256

所以当你输入1时,相当于char n = 1;
输入0 时相当于char n = 0;
所以当你输入32时 n = ' ';
当你输入78 n = 'N'。

中间不会发生错误,更不会抛出异常。
只是逻辑上与实际结果有点相背。
Bandry 2002-12-19
  • 打赏
  • 举报
回复
不懂你在说什么?输入了字母也就是读进第一个字母的值而已,没有什么
scanf也不是那样用的啊,&n才对。
luixui 2002-12-19
  • 打赏
  • 举报
回复
try...catch...自定义错误处理
加载更多回复(4)

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧