c语言scanf 逗号输入时为什么不能用逗号隔开

用户名:catghost
文章数:14
评论数:26
访问量:19137
注册日期:
阅读量:1297
阅读量:3317
阅读量:447898
阅读量:1132961
[匿名]51cto游客:
51CTO推荐博文
&& 今天下午补习专业课《数据结构》,期间遇到一个比较无语的问题,当有连续多个scanf()时,有时候能成功运行而有时候却无法读入数据。经过一段时间的调试,发现并无语法错误,则应该是C语言对此函数的一些历史遗留问题了。在向他人提问和网上搜索后,终于解决如次问题。原因如下:
&&scanf无法连用,主要是因为缓冲区不足,提交缓冲就好了。stdin 默认的缓冲区给了4k &加上一些系统的东西. 4k很快就不够用了。另一个原因是,第一scanf()接受一个字符输入,当你输入一个字符后按下回车,只有你输入的那个字符被赋给了a,而剩下的一个换行符还保留在缓冲中,当第二次输入时 无论你输入的什么字符,都是无效的,缓冲就如堆栈,符合先进先出原则,既然你缓冲中先前有个换行符,那么系统在遇见第二个scanf时自动会将换行符赋给 b,所以输入的东西都是无效的....所以 fflush 一下就可以解决此问题。最好在每个scanf前加上fflush( stdin );保证正常运行。
&&那么getch和getchar是否会产生这样的问题呢?答案是不会。具体过程尚未研究。同时,推荐大家以后在需要使用scanf时用scanf_s来代替,这也是为什么VS2010中,大家总会看到一条warning就是提示不要使用scanf而使用scanf_s的原因。
了这篇文章
类别:┆阅读(0)┆评论(0)问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我的代码如下:
#include &stdio.h&
int main(int argc, char **argv) {
scanf("%d", &i);
printf("%d", i);
当我输入字符a时,输出的好像是个随机数,执行几次结果不一样。
我阅读了《C标准库》中scanf函数的实现,发现其中是考虑到所有字母的。在对%d的格式进行处理时,会调用strtol函数进行转换,strtol实际又调用了_Stoul函数。这个函数首先处理了正负号、多余的空格,然后判断了是否是16进制和8进制,最后的核心转换代码如下:
for (s2 = sc, (sd = memchr(digits,
tolower(*sc), base)) != NULL; ++sc)
x = x*base + (sd - digits);
其中的digits数组定义如下:
static const char digits[] = {
/* valid digits */
"abcdefghijklmnopqrstuvwxyz"};
可以看到这个函数是考虑到了字母到数字的转换的。那么为什么我输入字符a后会输出一个随机的数呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为你输入字符a的时候scanf根本就没有往i里赋值,你又没有给i赋初值,所以i的值就是个随机数。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
scanf并未考虑所有字母啊,在%d十进制模式下,对于'0'~'9'以外的字母,都会被忽略掉,并期待输入正确的字符;
之所以那个函数会把abcdef什么的考虑进去,是因为在%x和%X十六进制模式下需要用到
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:

我要回帖

更多关于 c语言scanf 的文章

 

随机推荐