scanf 输入加逗号(或者不加逗号)出现的异常及解决方案
我们在写 C 语言代码通常 scanf 的格式控制部分都有两种习惯,加逗号与不加逗号,而这两种情况都会因为我们的不同输入习惯产生一定的问题,这里给出另一种方法。
1、不加逗号
#include<stdio.h> #define SWAP(a, b) a=a^b;b=a^b;a=a^b; void main()
{
int num1, num2;
printf("Input num1 and num2:");
scanf("%d%d", &num1, &num2);
SWAP(num1, num2);
printf("After the exchange:%d,%d\n",num1,num2);
}
下面这是3种不同的输入方式以及相应的输出结果
1.1用空格隔开两个变量
1.2用回车换行隔开
1.3用逗号隔开
我们可以发现前两种都没什么问题,而第三种就不是我们想要的结果了。
2、加逗号
#include<stdio.h> #define SWAP(a, b) a=a^b;b=a^b;a=a^b; void main()
{
int num1, num2;
printf("Input num1 and num2:");
scanf("%d,%d", &num1, &num2);
SWAP(num1, num2);
printf("After the exchange:%d,%d\n",num1,num2);
}
2.1用空格隔开
2.2用回车换行隔开
2.3用逗号隔开
巧的是,这次刚好和第一种相反,前两个都和预期不一样,第三个是我们要的。
3、解决方案
#include<stdio.h> #define SWAP(a, b) a=a^b;b=a^b;a=a^b; void main()
{
int num1, num2;
printf("Input num1 and num2:");
scanf("%d%*c%d", &num1, &num2);
SWAP(num1, num2);
printf("After the exchange:%d,%d\n",num1,num2);
}
接下来看看这次的结果。
3.1空格隔开
3.2回车换行隔开
3.3逗号隔开
我们惊喜地发现这次 3 种输入方式都是我们想要的结果了。
4、说明
scanf 要求输入的格式必须与自己设定的保持一致,1 和 2 的代码之所以会报错就是因为输入和设定的不一样。而在 3 的代码中,%*c 充当了一个提取我们分割变量的一个容器,可以把我们输入的各种分割字符都提取出去,所以 3 种输入方式都正常了。
ps:这种方法不适合两个变量都是字符串
作者:耑新新,发布于 博客园
转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com
scanf 输入加逗号(或者不加逗号)出现的异常及解决方案的更多相关文章
- 封装js千分位加逗号和删除逗号
//封装js千分位加逗号和删除逗号 alert( format(2545678754.020001) ) //2,545,678,754.03 alert( format(-2545678754.02 ...
- notepad++给每一列数据加单引号及逗号结尾
原始数据: 对列操作--先加前引号(光标放在第一行哦):编辑-->列块编辑 再加后引号和逗号(文本尾端不齐,就用替换): 打开替换窗口:ctrl+F(其实就是查找) 加完引号和逗号效果:(如果最 ...
- 函数基础重点掌握内容:创建函数、return返回单个值、return返回多个值、函数名加括号与不加括号的区别
##比较两个数大小 #有参函数!!! def compare(s,t): if s > t: print(s) else: print(t) f=compare compare(1000,30) ...
- onclick时间加return和不加return的区别
JAVASCRIPT在事件中调用函数时用return返回值实际上是对window.event.returnvalue进行设置. 而该值决定了当前操作是否继续.当返回的是true时,将继续操作.当返回是 ...
- 哦这。。!C语言scanf输入的坑爹之处
一. 今天闲来无事,跑去A题,本想3sA了poj1004,结果搞了10分钟,最令人困惑的问题就是为什么定义了double类型的变量,但是用scanf输入的时候标识符用%f的话,输入并不能完成,也就是说 ...
- 网站域名加WWW与不加WWW区别
不知道站长童鞋们有没有注意到,很多网站在打开时,地址栏里的域名有的带有“www.”,而有的网站前面则没有带“www.”这其中有什么区别呢?作为一个新站长,我什么都不懂,就在百度上搜了一艘,也没找到一个 ...
- new对象时,类名后加括号与不加括号的区别
[1]默认构造函数 关于默认构造函数,请参见随笔<类中函数> 请看测试代码: 1 #include <iostream> 2 using namespace std; 3 4 ...
- C++中创建对象的时候加括号和不加括号的区别
c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...
- 测试scanf输入含非法控制符
心得: 学到scanf命令时第一个想到的就是可以利用scanf做一个十进制转16进制.八进制的小程序,很天真的以为也可以转二进制,在搜索字符控制符的时候才知道原来没有二进制的控制字符,需要换算出来得出 ...
随机推荐
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 前端学习 -- Css -- 浮动
块元素在文档流中默认垂直排列,所以这个三个div自上至下依次排开,如果希望块元素在页面中水平排列,可以使块元素脱离文档流. 使用float来使元素浮动,从而脱离文档流 可选值: none,默认值,元素 ...
- 伤不起:File.toPath() & Paths.get()
java.nio.file.Path这个类应该是从java7才开始有的. 通过File类有两个方法可以转换成Path. 1. Path p = Paths.get(file.toURI()); // ...
- js中全局变量修改后的值不生效【jsp页面中各个js中内容的加载顺序】
一个老项目中,一个jsp文件中有很多个js文件, 现在要在页面上的一个地方判断一个状态,因为一直找不到原来是在哪里修改的那个状态,所以决定不找了,而是在比较靠前引入的一个js中定义一个全局变量,然后在 ...
- Windows的DOS命令基础
Windows的DOS命令基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.dir: 查看当前路径下的目录(directory)详细信息 . 详细信息: a>.dir ...
- Solr记录-solr基础内容
Solr架构(体系结构) 在本章中,我们将讨论Apache Solr的架构. 下图显示了Apache Solr的体系结构的框图. Solr架构 - 构件块以下是Apache Solr的主要构建块(组件 ...
- POJ - 3026 Borg Maze(最小生成树)
https://vjudge.net/problem/POJ-3026 题意 在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的 ...
- Codeforces 662 C. Binary Table
http://codeforces.com/contest/662/problem/C 题意:n行m列01矩阵,每次可以反转一行或一列,问最后最少可以剩下多少个1 n只有20,把行状态压缩 操作奇数次 ...
- Lua程序设计(一)面向对象概念介绍
完整代码 local mt = {} mt.__add = function(t1,t2) print("两个Table 相加的时候会调用我") end local t1 = {} ...
- 那些年的 网络通信之 UDP 数据报包传输---
下面是 一个多线程,基于 UDP 用户数据报包 协议 的 控制台聊天小程序 import java.io.*; import java.net.*; class Send implements Run ...