连续调用scanf的问题总结

对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下:

1、多个scanf之后,后序以 scanf("%c",&c)

当程序连续调用scanf 函数的,前面的获得输入接收的时候,一般结束都是以一个空白字符(空格、enter),比如enter 结束输入;但是,当后面接着是还有一个以 scanf("%c",&a) 的时候,则上面输出 enter 作为结束符,就会被输入到a,从而导致了a 为空。

(1)以%d 继续输入的时候:

<PRE>int main(void)
{
    int a, b, c = 0;
    printf("input a,b\n");
    scanf("%d,%d", &amp;a,&amp;b);
    printf("input c\n");
    scanf("%d", &amp;c);
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    while (1);
}
input a,b
1,2
input c
3
a = 1, b = 2, c = 3</PRE>

(2)以%c继续输入的时候:

int main(void)
{
    int a, b, c = 0;
    scanf("%d,%d", &a,&b);
    scanf("%c", &c);
    printf("a = %d, b = %d, c = %c\n", a, b, c);
    while (1);
}

结果:

input a,b
1,2
a = 1, b = 2, c =

结果很神奇,当输入1,2 结束输入:enter之后,就直接是打印出了结果,c压根就没有手动输入就被打印了出来。

原因解释:

输入a,b 值的时候,输入的是: 1,2 enter 。当所以输入的数据里面就有了三个数据,也就是: 1 2 enter,三个数据。当全部都是以 %d 格式作为输入,1赋值给a,2赋值给b,但是enter 很显然不是 %c 格式的,就被 pass 掉,只有当输入的是数字的时候,并将输入的数值3 赋值给 c。

当是以: %d,%d,%c 连续输入的时候,我们知道,输入的是1,2 enter,1赋值a,2赋值给b,而此时,%c,要求的是输入一个字符,就会把 enter 赋值给 c,所以这就造成了 c 打印的结果为空。

scanf 的工作原理:

scanf 的工作原理是将用户的任何输入保存到缓冲区之中,当存在 scanf 的时候,则从缓冲区的队列中读取数据,直到遇见空白字符(空格、enter、tab、换页符)的时候又或者不是本次输入指定类型的时候,就结束这一次的输入。所以,当连续输入为 %d、%f、%x 等数据格式,则可以自动跳过空白字符,因为类型不匹配嘛,直到出现数字位为止;

解决的办法:

(1)通过判断是否输入的为 enter

int main(int argc, char *argv[])
{
    int a, b, c = 0;
    scanf("%d,%d", &a, &b);
    do
    {
        scanf("%c", &ac);
    } while (c == ‘\n‘);

    printf("a = %d, b = %d, c = %c\n", a, b, c);
    while (1);
}

添加了 do while 循环,获得输入为真,也就是获得的输入为enter 或者其他的空白的字符的话,则循环输入,当输入的是要求的数据类型(%c)的时候,就退出循环体,保证可以获得c值。

(2)输入添加空白字符(空格)


<PRE>int main(int argc, char *argv[])
{
    int a, b, c = 0;
    scanf("%d,%d", &a, &b);

    scanf(" %c", &c);   // %c 前面添加了空格,也就是前面是允许出现空格(enter)

    printf("a = %d, b = %d, c = %c\n", a, b, c);
    while (1);
}</PRE>

其实就是scanf(" %c",&c),多添加了一个空格,。空格%c: 指定了输入的内容是: 空格+%c 的模式。

2、连续多个字符的输入

当需要连续输入多个字符的时候:

<PRE>int main(int argc, char *argv[])
{
    char a, b;
    scanf("%c", &amp;a);
    scanf("%c",&amp;b);
    printf("a = %c, b = %c\n", a, b);
    while (1);
}</PRE>

结果为:

a
a = a, b =

还是会把 enter 赋值给b,

解决的办法:

(1)添加空格
<PRE>int main(int argc, char *argv[])
{
    char a, b;
    scanf("%c", &a);
    scanf(" %c",&b);
    printf("a = %c, b = %c\n", a, b);
    while (1);
}

结果输入:

a
b
a = a, b = b

原因不做解释,上面已经做好了解释。

(2)添加 do while 去判断
<PRE>int main(int argc, char *argv[])
{
    char a, b;
    scanf("%c", &a);
    do
    {
        scanf("%c", &b);
    } while (  b == ‘\n‘);
    printf("a = %c, b = %c\n", a, b);
    while (1);
}
时间: 2024-10-11 12:37:05

连续调用scanf的问题总结的相关文章

类的连续调用方法

class a{ private $b = 0; public function c( $Num = 0 ) { $this->b = $Num; return $this; //关键就在这里,有这条就可以连续调用了, } public function d($d) { $this->b = $this->b+$d; return $this; } public function e(){ echo $this->b; } } //接下来是调用 $Obj = new a; $Obj

AFN的实时网络监控 但是block连续调用了两次

[[AFNetworkReachabilityManager sharedManager] startMonitoring]; [[AFNetworkReachabilityManager sharedManager ] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case -1: NSLog(@"未知网络"); break; case 0: NSL

js实现函数的连续调用

用js的方式实现如jquery那样的方法连续调用 $("div").width(100).height(500).html(123); var obj = {}; obj.func1 = function () { console.log('func1'); return this; }; obj.func2 = function () { console.log('func2'); return this; }; obj.func1().func2(); 原文地址:https://w

一个简单的连续调用脚本部署代码的案例

先简单描述一下环境,Jenkins部署在私有云,从git拉取代码并编译后会调用脚本将jar包部署到阿里云的应用服务器.阿里云应用服务器无公网IP,通过跳板机登录.就产生了连续调用脚本,穿透跳板机部署到阿里云内网的需求. 服务器信息:**主机名称 IP ** git server 10.150.27.51 jenkins server 10.150.27.52 jump server 1.1.1.1/192.168.2.20 app server1 192.168.2.21 app server1

C++——类的成员函数的连续调用与返回值问题

一.返回值问题 1 #include <iostream> 2 3 using namespace std; 4 5 class X 6 { 7 public: 8 int a = 3; 9 X set1(int b) 10 { 11 a = b; 12 return *this; 13 } 14 }; 15 16 int main() 17 { 18 X x; 19 x.set1(6); 20 cout << x.a; 21 22 return 0; 23 } 此处set1函数的

【JavaScript】 模拟JQuery的连续调用函数

连续调用,了解调用主体 var zhangsan = { smoke: function () { console.log("Smoking..."); return this; }, drink: function () { console.log("drinking..."); return this; }, perm: function () { console.log("Perming..."); return this; } } zha

多个atomic类连续调用能否构成原子性?

答案是不能保证,具体可以参考下边案例: public class MyAtomic { AtomicInteger count = new AtomicInteger(0); public void test(){ for(int i=0;i<10000;i++){ /*此处模拟多个类连续调用:可能出现线程一拿到count为999,线程二拿到count为999, 这样会造成count进行多次+1,所以输出的结果会大于一千*/ if(count.get()<1000) { count.incre

C-Scanf连续调用多次并且存在%c的问题

问题现象: 当程序中存在多个scanf时,针对第一个scanf的输入,一般用户会以空白字符(空格.换行.tab.换页符)等结束.但若后面有一个scanf(“%c”,&ch),则刚才输入的空白字符会被此次的scanf读入,因此空白字符也是一个字符,此将导致ch为空. 原因解释: scanf的工作原理:(一般情况,即格式串中没有其它字符)用户的任何输入将被保存在缓冲之中,当有scanf时,scanf则从此缓冲队列中读取字符,直至遇到空白字符或者是此字符不可能是本次的输入为止,并把此字符放回原队列,此

WPF Loaded事件连续调用两次的问题

最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句: this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇怪.如是参照系统中的代码逻辑写了一个demo. MainWindow代码如下: private void Window_Loaded(object sender, RoutedEventArgs e) { TabItem item = new TabItem(); UserControl1 test