精华内容
下载资源
问答
  • 既然这样,那只需要加一个循环,每次检测录入的数据项数是否为全部数据的个数,不是则说明有内容没有录取到(即出现非法字符),此时可以输出提示要求重新输入。 自然地我们出以下代码: //以检查输入的是否一个...

    aaaaaa第三篇赶上!

    判断scanf输入的是否为整型

    # 需求
    很多时候我们需要用scanf输入数据,但人为输入的数据可能不符合指定的类型,自然地我们想到了判断输入类型是否正确。

    # 实现
    那该怎么实现呢?这里我们可以利用scanf的返回值:
    scanf返回值:返回成功读入的数据项数

    既然这样,那只需要加一个循环,每次检测录入的数据项数是否为全部数据的个数,不是则说明有内容没有录取到(即出现非法字符),此时可以输出提示要求重新输入。

    自然地我们写出以下代码:

    //以检查输入的是否一个整型为例(VS2019)
    int n;
    while (scanf_s("%d", &n) == 0)
    {
    	printf("输入了非法字符!\n");
    }
    

    !!但是,问题出现了
    输入非法字符后,结果是这样的:
    啊这,发生了甚么?!

    可以看到,while变成死循环了,并没有给我们再次输入的机会QAQ,到底发生了甚么?!

    # 分析
    这时候就需要看看scanf的运作原理了
    当要求的类型与输入的类型不符合时,scanf会选择直接跳过不接收该输入,注意只是不接收,也就是说缓存区中输入的东西既没被接收也没有被清除,就这么留在那里。

    那问题就来了,当下一次用户要输入时,scanf看到缓存区有东西,就直接去读取了,结果又读到与指定类型不符合的,又跳过了,由此触发了无限循环(傻fufu的)

    # 解决方案
    完成了分析,接下来就好处理了,只需要把缓存区的东西清掉不要让scanf傻傻的又去读取就好啦!

    相关代码段:while (getchar() != '\n');
    这一句可以简单地解决清楚缓存区的功能
    原理是每次都向缓存区读取数据,如果没到尾就继续读取,直到把所有东西读完,再跳出(注意while执行的是空语句)

    到这里,问题就都解决了 – 需求 OK,bug KO

    # 完整代码

    //以检查输入的是否一个整型为例(VS2019)
    int n;
    while (scanf_s("%d", &n) == 0)
    {
    	printf("输入了非法字符,请重新输入:");
    	while (getchar() != '\n');
    }
    

    *注:这里的getchar已经不用自己输入了,原因和scanf的死循环一样,缓冲区已经有东西了,getchar会直接读取而不会让我们输入

    运行结果:
    在这里插入图片描述

    可以看到问题已经完美解决了~


    2021-3-29 方案完善

    在后续的使用中,出现了一些问题,如下:
    在这里插入图片描述
    可以看到:
    当输入的数据以数字开头,而带有字符时
    该解决方案会截取到数字部分,视为合法数据,而后面的字符则留在了缓冲区

    这将直接导致下一次的输入被跳过直接取出缓冲区的字符,显然不是我们希望的,所以做了如下改进:

    int n;
    while (scanf_s("%d", &n) == 0 || getchar() != '\n')
    {
    	printf("输入了非法字符,请重新输入:");
    	while (getchar() != '\n');  // 清除缓存区
    }
    

    解释:

    • 如果为 0 则说明第一个位置出现了字符
    • 不为 0 说明前面是整型,此时再取出后面一个字符
    • 如果为 \n 则数据没问题,要是还有东西则又是非法字符

    这样就可以保证输入的全部为所需的整型

    效果如下:
    在这里插入图片描述

    好的,完结收工~
    如果还有后续问题欢迎指正!


    第3篇完成,打卡!!
    冰冻三尺非一日之寒(寒冰小澈)

    展开全文
  • 怎么死循环了!

    2016-04-30 22:23:00
    怎么死循环了! c语言在进行运算的时候,一个有符号整数和一个无符号整数参与运算,结果将是一个无符号数。这也是常见的无解,一不小心就出了死循环。 当然,这里的i-DELTA直接为i-4 是没问题的,因为4默认是...

    怎么就死循环了!

    c语言在进行运算的时候,一个有符号整数和一个无符号整数参与运算,结果将是一个无符号数。这也是常见的无解,一不小心就写出了死循环。
    当然,这里的i-DELTA直接写为i-4 是没问题的,因为4默认是有符号数,除非你加上U

    #include <stdio.h>
    
    void main(){
        int i=30;
        #define DELTA sizeof(int)
        for(;i-DELTA>=0;i--){
            printf("%d\n",i);
        }
    }

    类似的例子在go中是行不通的,go干脆直接报错,说无符号数不能和有符号数一起运算,只能进行类型转换以后再运算。看来go还是很明智的避免了这些陷阱啊!

    展开全文
  • 1. c语言延时函数delay,怎么算延时下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为这个,在延迟函数里...

    1. c语言延时函数delay,怎么算延时

    下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为这个,在延迟函数里写一些无关紧要的东西,用来浪费电脑处理时间,从而达到延迟目的。数原型:

    原型:

    void Delay(unsigned int nDelay)

    {

    unsigned int i,j,k;

    for ( i=0;i

    for ( j=0;j<6144;j++ )

    k++;

    }

    用法:#include

    功能:短暂延时

    说明:延时msec*4毫秒所以,delay的延迟时间是和你的cpu时钟周期相关的。

    2. C语言delay的延时函数怎么写

    回答这个问题前提需要搞清楚:

    1.你的执行文件在那里运行?

    2.你要延时是否“死等”,还是可以切换到其他任务?

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

    如果你只是学习c语言,写个小函数玩玩,可以如下:

    void delay(int time)

    {

    for(;time>0;time--)

    {

    nop;//可写任何无意义的操作

    }

    }

    死等型的延时,时间根据指令执行速度不同而不同!!!!

    3. delay() c语言延迟函数

    1、delay函数是一般自己定义的一个延时函数。

    2、C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。下面给出一个经典的延时函数。

    // 定义一个延时xms毫秒的延时函数

    void delay(unsigned int xms) // xms代表需要延时的毫秒数

    {

    unsigned int x,y;

    for(x=xms;x>0;x--)

    for(y=110;y>0;y--);

    }

    4. 单片机中用写delay函数做延时和用定时器做延时有什么区别

    利用循环处理的方式实现的延时,并不精确。

    1、当中断发生时,CPU被打断先执行中断服务。导致执行时间变长。

    2、使用高级语言时,编译的结果受优化等级等多方面因素干扰,难以计算。

    3、在有MMU和Cache的MCU中,指令的执行速度还会受到缓存的影响。

    利用定时器延时:

    1、因为定时器累加与CPU无关,即使中断,仍然会保持计数。不受上述问题影响

    2、缺点需要占用定时器资源。

    3、功耗也会高一些

    5. 这延时函数怎么理解void Delay1ms

    与单片机的计算速度有关,主要看cpu频率

    假如你的单片机cpu频率为8Mhz

    则该单片机大约每秒进行8 000 000次的运算,

    这个delay函数就是通过i,j,k的自减运算来达到延迟效果

    一直减到ijk都为0才执行下一段函数

    delay(10)就是让单片机进行 i(10) * j(10) * k(50)=5000次的自减运算,时间大约为5000/8 000 000=0.625ms

    自己可以根据这个算法来简单测算出延迟时间

    6. 请求单片机delay延时函数

    void delay1(unsigned int j)

    {unsigned char i;

    do{for(i=0;i<2;i++);

    j--;

    asm("nop");}

    while(j);

    }

    这是us延时,有误差,j的值越大相对误差越小。不过相信误差应该在你的可接受范围内。

    void delay1(unsigned int j)

    {unsigned int i;

    do{for(i=0;i<2853;i++);

    j--;}

    while(j);

    }

    这是ms延时,有误差,j的值越大相对误差越小。不过相信误差应该在你的可接受范围内。

    你可以试试,不行我再给你调

    7. 怎么写段单片机延时函数

    1、首先分析您的程序,

    void delay()

    {

    int i;

    if(1 == TF0)//if(TF0==1),查询定时器溢出标志位

    {

    TF0=0;

    i=10000;//定时溢出时给i赋值1000

    TH0=0xDC;TL0=0x00;

    i--;//i=999,如果还没有减到0时定时器又溢出,则i永远不会减到0!!!!所以您的这段程序不应该行不通!!

    }

    while(1)

    {

    if(i==0)

    break ;

    }

    }

    2、建议做法

    (1)定义一个全局变量用于作定时计数如unsigned char n;

    (2)定时器采用以某一时间基准(10ms)中断方式,每中断一次中断处理程序里n++;

    (3)在延时函数中对n进行操作,如延时1s即1000ms则:

    void delay_1s()

    {

    while(n

    8. 请求单片机delay延时函数

    void delay1(unsigned int j){unsigned char i;do{for(i=0;i<2;i++);j--;asm("nop");}while(j);}这是us延时,有误差,j的值越大相对误差越小。

    不过相信误差应该在你的可接受范围内。void delay1(unsigned int j){unsigned int i;do{for(i=0;i<2853;i++);j--;}while(j);}这是ms延时,有误差,j的值越大相对误差越小。

    不过相信误差应该在你的可接受范围内。你可以试试,不行我再给你调。

    60d5d2c32818add7

    转载请注明出处育才学习网 » matlab延时函数怎么写

    展开全文
  • Shell语言(While死循环)

    千次阅读 2019-06-12 09:14:58
    那在shell脚本中的死循环怎么写呢? 对于熟悉C语言的猿人们来说,最简单的死循环应该这样写: while(1) { //do something } 或者你也可以用for语句和do…while语句来实现,这里就不说了! 可是怎么在shell脚本...

    原文

    在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环该怎么写呢?

    对于熟悉C语言的猿人们来说,最简单的死循环应该这样写:


    while(1)

    {

    //do something
    

    }


    或者你也可以用for语句和do…while语句来实现,这里就不说了!

    可是怎么在shell脚本中写死循环呢?

    对于对shell不怎么熟悉的猿人来说,相信这个问题肯定难倒过大家,反正这个问题曾经难住了我…

    上网google了查阅了一番资料后,我恍然大悟了!原来可以这么写:


    while [ “1” = “1” ]

    do

    do something

    done


    或者


    while test “1” = “1”

    do

    do something

    done


    也许,你会觉得和C语言中的有点像,果不其然!但是请注意这是脚本!

    看到这里你也许就知道了在shell中怎么写一个死循环了,可是这真的是最简单的死循环吗?

    其实不是的!最简单的死循环该这样写,(注意:我在这里称其为最简单,也许还有跟简单的!)


    while :

    do

    do something

    done


    看到这里,也许你会很纳闷儿,这是什么东西,甚至怀疑我在”迈大步子“-----”扯蛋“,其实我的步子迈的很小,绝对扯不到蛋的!

    没错,这的确是一个死循环,不信你可以试一下!注意”#“在shell中是注释这一行的意思,除了这个除外#!/bin/sh

    还有”:“在shell中表示空语句,就是什么也不做!相当于C中的”;“!

    好了,就写到这里了!

    谢谢浏览!

    展开全文
  • shell编程之while死循环

    2018-08-09 11:45:00
    那在shell脚本中的死循环怎么写呢? 对于熟悉C语言的猿人们来说,最简单的死循环应该这样写: ------------------------------------------------------------------------- while(1) { //do somethi...
  • shell脚本编程之“最简单的死循环

    千次阅读 2015-07-14 19:57:50
    shell脚本编程之“最简单的死循环”   在linux下编程的程序猿都知道...那在shell脚本中的死循环怎么写呢? www.2cto.com   对于熟悉C语言的猿人们来说,最简单的死循环应该这样写: -------------------
  • 在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环怎么写呢? 对于熟悉C语言的猿人们来说,最简单的死循环应该这样写: ----------------------------...
  • c语言细节

    2010-02-02 22:54:00
    UL 为unsigned long1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)?#define SECONDS_PER_YEAR (60 * 60 * 24... 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?首选的方案
  • C语言数组用法小技巧

    万次阅读 多人点赞 2018-12-03 21:09:23
    这可能是C语言的第四次教程,主要是讲讲数组的一些用法吧。 一.数组的下标记录用法 首先,我们看例题吧首先我们看例题: 某个超大社区需要统计社区人数,给定为n(0&lt;=n&lt;=10000)人,我们需要一个...
  • c语言笔试题 1,用预处理指令#define 声明一个常数,用以表明一年中有多少秒。...3, 你怎么样用C编写死循环呢? 答: for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 w
  • 4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 5. 用变量a给出下面的定义 6. 关键字static的作用是什么? 7.关键字const是什么含意? 8. 关键字volatile有什么含意 并给出三个不同的例子 9....
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    UP测试,温度循环测试,高温贮存测试,湿度贮存测试等。 成测则是产品封装好后的测试,即PACKAGE测试。即是所有通过中测的产品封装后的测试,方法主要是机台自动测试,但测试项目仍与WAFER TEST相同。PACKAGE...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型...
  • 难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示...
  • C语言面试基础题以及答案

    千次阅读 2014-05-22 14:22:45
    1. 用预处理指令#define 声明...3.你怎么样用C编写死循环呢? 4. 用变量a给出下面的定义 a)一个整型数(An integer) b)一个指向整型数的指针(A pointer to an integer) c)一个指向指针的的指针,它指向的指针是
  • 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)? #define SECONDS_... 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 首选的方案是: while(1) {
  • 求大神解答 已考虑无雷区自动翻开的死循环 可能是双击时陷入死循环 但看不出是不是这个问题 不知道怎么修改代码 #include #include #include #include #define len 20 //边数 int mine[len+2][len+2] = ...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
  • 面试题:最常见最有可能考到的C语言面试题汇总

    万次阅读 多人点赞 2017-08-17 17:03:54
    1. 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL(无符号...4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 这个问题
  • 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)?#define SECONDS_PER_YEAR (60 * 60 * 24 ... 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?首选的方案是:while(1) { }4
  • 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 2  1.4 新的64位机上的64位...
  • 1、一个“标准”宏,这... 2、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。 while(1){}或者for(;;) 3、关键字static的作用是什么? 定义静态变量 4、关键字const有什么含意? 表示常量不可以修改的变
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

c语言死循环怎么写

c语言 订阅