我们在写 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 输入加逗号(或者不加逗号)出现的异常及解决方案的更多相关文章

  1. 封装js千分位加逗号和删除逗号

    //封装js千分位加逗号和删除逗号 alert( format(2545678754.020001) ) //2,545,678,754.03 alert( format(-2545678754.02 ...

  2. notepad++给每一列数据加单引号及逗号结尾

    原始数据: 对列操作--先加前引号(光标放在第一行哦):编辑-->列块编辑 再加后引号和逗号(文本尾端不齐,就用替换): 打开替换窗口:ctrl+F(其实就是查找) 加完引号和逗号效果:(如果最 ...

  3. 函数基础重点掌握内容:创建函数、return返回单个值、return返回多个值、函数名加括号与不加括号的区别

    ##比较两个数大小 #有参函数!!! def compare(s,t): if s > t: print(s) else: print(t) f=compare compare(1000,30) ...

  4. onclick时间加return和不加return的区别

    JAVASCRIPT在事件中调用函数时用return返回值实际上是对window.event.returnvalue进行设置. 而该值决定了当前操作是否继续.当返回的是true时,将继续操作.当返回是 ...

  5. 哦这。。!C语言scanf输入的坑爹之处

    一. 今天闲来无事,跑去A题,本想3sA了poj1004,结果搞了10分钟,最令人困惑的问题就是为什么定义了double类型的变量,但是用scanf输入的时候标识符用%f的话,输入并不能完成,也就是说 ...

  6. 网站域名加WWW与不加WWW区别

    不知道站长童鞋们有没有注意到,很多网站在打开时,地址栏里的域名有的带有“www.”,而有的网站前面则没有带“www.”这其中有什么区别呢?作为一个新站长,我什么都不懂,就在百度上搜了一艘,也没找到一个 ...

  7. new对象时,类名后加括号与不加括号的区别

    [1]默认构造函数 关于默认构造函数,请参见随笔<类中函数> 请看测试代码: 1 #include <iostream> 2 using namespace std; 3 4 ...

  8. C++中创建对象的时候加括号和不加括号的区别

    c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...

  9. 测试scanf输入含非法控制符

    心得: 学到scanf命令时第一个想到的就是可以利用scanf做一个十进制转16进制.八进制的小程序,很天真的以为也可以转二进制,在搜索字符控制符的时候才知道原来没有二进制的控制字符,需要换算出来得出 ...

随机推荐

  1. Nginx upstream 配置

    1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况.例如:u ...

  2. Cheerleaders UVA - 11806(容斥+二进制技巧)

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  3. Invalid format of Import utility nameVerify that ORACLE_HOME is properly oracle11.2g 无法imp,dmp

    1.环境变量 ORACLE_HOME 设置了没  D:\app\product\11.2.0\client_1 2.环境变量 ORACLE_SID  设置为orcl 上面是网上流行的解决方案,然而博主 ...

  4. MT【74】不可能是哪个函数?

    解答:设$f(g(x_0))=x_0$,则$g(f(g(x_0)))=g(x_0)$,令$y_0=g(x_0)$则$g(f(y_0))=y_0$有解.易得答案为$B$.

  5. 学习笔记(two sat)

    关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...

  6. 【bzoj4730】 Alice和Bob又在玩游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4730 (题目链接) 题意 给出一个森林,两个人轮流操作,每次把一个节点以及它的祖先全部抹去,无节点可 ...

  7. springboot通过ssh通道连接mysql数据库

    navicat可以通过ssh通道连接mysql数据库,那java中如何实现了,springboot又该怎样集成呢? 1.添加包 <dependency> <groupId>co ...

  8. HDU 5574 Colorful Tree

    • 给出一棵树,每个点有初始的颜色,支持两种操作• 将一个点的子树染成一种给定颜色• 问一个点的子树里有几种不同的颜色 •

  9. Delphi 的内存操作函数(5): 复制内存

    MoveMemory.CopyMemory 的功能类似, 都是复制内存, 都是调用 Move 过程; MoveMemory.CopyMemory 操作指针; Move 操作实体. 还要注意, 它们的参 ...

  10. ModelMap对象的 addAttribute,put两个方法区别

    这个是 源码中 ModelMap的定义 类 public class ModelMap extends LinkedHashMap<String, Object> 说明 ModelMap是 ...