当前位置: 首页 > news >正文

C语言之简单的获取命令行参数和环境变量

C语言之简单的获取命令行参数和环境变量

本人的开发环境为WIN10操作系统用VMWARE虚拟的UBUNTU LINUX 18.04LTS!!!
所有代码的编辑、编译、运行都在虚拟机上操作,初学的朋友要注意这一点!!!
详细情况如下:

songvm@ubuntu:~/works/xdn/boo$ uname -a
Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

命令行参数

  • 常见C语言main函数带有两个参数:整型的argc和字符串指针型的argv。
  • 这两个参数就是命令行参数相关的参数
  • 整型 argc 保存命令行参数的数量
  • 字符串指针 argv 保存命令行参数的值
  • 命令行参数要用空格隔开!!!
  • 测试代码如下:
/* filename: opt.c */
#include <stdio.h>/**/
int
main (int argc, char *argv[])
{printf ("Argument count : %d\n", argc);printf ("Command is [%s]\n", argv[0]);return 0;
}

编译运行,输出结果如下:

songvm@ubuntu:~/works/xdn/boo$ gcc opt.c -o opt
songvm@ubuntu:~/works/xdn/boo$ ./opt
Argument count : 1
Command is [./opt]
songvm@ubuntu:~/works/xdn/boo$ 

带参数测试

  • 上面的结果可见参数总量为1,字符串数组引用索引为0,即argv[0],也就是命令本身!
  • 加上两个参数测试,代码如下:
/* filename: opt.c */
#include <stdio.h>/**/
int
main (int argc, char *argv[])
{printf ("Argument count : %d\n", argc);printf ("Command is [%s]\n", argv[0]);for (int i = 0; i < argc; i++)printf ("Argument %d is [%s]\n", i, argv[i]);return 0;
}

编译运行,输出结果如下:

songvm@ubuntu:~/works/xdn/boo$ ./opt -s zoo.t
Argument count : 3
Command is [./opt]
Argument 0 is [./opt]
Argument 1 is [-s]
Argument 2 is [zoo.t]
songvm@ubuntu:~/works/xdn/boo$ 

提示加命令行参数

  • 事实上你可以加任意命令行参数,然后通过循环输出!!!
  • 如果没有参数需要要提示用加上参数!!!
  • 测试代码如下:
/* filename: opt.c */
#include <stdio.h>/**/
int
main (int argc, char *argv[])
{printf ("Argument count : %d\n", argc);printf ("Command is [%s]\n", argv[0]);for (int i = 0; i < argc; i++)printf ("Argument %d is [%s]\n", i, argv[i]);if (argc == 1)printf ("Please add some arguments!\n");return 0;
}

编译运行,输出提示信息:

songvm@ubuntu:~/works/xdn/boo$ gcc opt.c -o opt
songvm@ubuntu:~/works/xdn/boo$ ./opt
Argument count : 1
Command is [./opt]
Argument 0 is [./opt]
Please add some arguments!
songvm@ubuntu:~/works/xdn/boo$ 

事实上main函数还有第三个参数envp

  • 字符串指针envp保存系统的环境变量!!!
  • 先读出一个环境变量看看什么情况,代码如下:
/* filename: opt.c */
#include <stdio.h>/**/
int
main (int argc, char *argv[], char *envp[])
{printf ("Environment Variables\n");printf ("%s\n", envp[0]);return 0;
}

编译运行,输出如下:

songvm@ubuntu:~/works/xdn/boo$ gcc opt.c -o opt
songvm@ubuntu:~/works/xdn/boo$ ./opt
Environment Variables
CLUTTER_IM_MODULE=xim
songvm@ubuntu:~/works/xdn/boo$ 

输出所有环境变量

  • 不同编译运行环境可能输出的结果不同!!!
  • 显示的是:CLUTTER_IM_MODULE=xim
  • 环境变量名:CLUTTER_IM_MODULE,输入法模块,IM -> input method
  • 环境变量值:xim ,Linux下的输入法工具,包含拼音和五笔等
  • 可能是安装系统时最后安装设置的输入法,所以首先显示的是这一个环境变量!
  • 试一试输出所有环境变量,代码如下:
/* filename: opt.c */
#include <stdio.h>/**/
int
main (int argc, char *argv[], char *envp[])
{printf ("Environment Variables\n");printf ("%s\n", envp[0]);int i = 0;while (envp[i] != NULL){printf ("%s\n", envp[i]);i++;}return 0;
}

编译运行,输出如下:

songvm@ubuntu:~/works/xdn/boo$ gcc opt.c -o opt
songvm@ubuntu:~/works/xdn/boo$ ./opt
Environment Variables
CLUTTER_IM_MODULE=xim
CLUTTER_IM_MODULE=xim
LS_COLORS=
LC_MEASUREMENT=zh_CN.UTF-8
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_PAPER=zh_CN.UTF-8
LC_MONETARY=zh_CN.UTF-8
XDG_MENU_PREFIX=gnome-
LANG=zh_CN.UTF-8
DISPLAY=:0
OLDPWD=/home/songvm/works/xdn
GNOME_SHELL_SESSION_MODE=ubuntu
USERNAME=songvm
INSIDE_EMACS=25.2.2,comint
XDG_VTNR=2
GIO_LAUNCHED_DESKTOP_FILE_PID=6401
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
LC_NAME=zh_CN.UTF-8
XDG_SESSION_ID=2
USER=songvm
DESKTOP_SESSION=ubuntu
QT4_IM_MODULE=xim
TEXTDOMAINDIR=/usr/share/locale/
PWD=/home/songvm/works/xdn/boo
HOME=/home/songvm
TEXTDOMAIN=im-config
SSH_AGENT_PID=1535
QT_ACCESSIBILITY=1
XDG_SESSION_TYPE=x11
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
XDG_SESSION_DESKTOP=ubuntu
LC_ADDRESS=zh_CN.UTF-8
GJS_DEBUG_OUTPUT=stderr
LC_NUMERIC=zh_CN.UTF-8
GTK_MODULES=gail:atk-bridge
COLUMNS=80
PAPERSIZE=a4
WINDOWPATH=2
SHELL=/bin/bash
TERM=dumb
QT_IM_MODULE=xim
XMODIFIERS=@im=ibus
IM_CONFIG_PHASE=2
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/emacs25.desktop
XDG_SEAT=seat0
SHLVL=1
LANGUAGE=zh_CN:en
LC_TELEPHONE=zh_CN.UTF-8
GDMSESSION=ubuntu
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=songvm
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/run/user/1000/gdm/Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LC_IDENTIFICATION=zh_CN.UTF-8
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
TERMCAP=
SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/1458,unix/ubuntu:/tmp/.ICE-unix/1458
LESSOPEN=| /usr/bin/lesspipe %s
GTK_IM_MODULE=ibus
LC_TIME=zh_CN.UTF-8
_=./opt
songvm@ubuntu:~/works/xdn/boo$ 

获取某一环境变量的值

  • 以上输出内容挺多,在这N个环境变量中,如何取单独的某一个环境变量呢?如常用的:PATH
  • getenv函数,在stdlib.h头文件中定义,测试代码如下:
/* filename: opt.c */
#include <stdio.h>
#include <stdlib.h>/**/
int
main (int argc, char *argv[], char *envp[])
{printf ("Get environ variable PATH : [%s]\n", getenv("PATH"));return 0;
}

编译运行,达到预期,输出结果如下:

songvm@ubuntu:~/works/xdn/boo$ ./opt
Get environ variable PATH : [/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]
songvm@ubuntu:~/works/xdn/boo$ 

测试一下内存分配情况,发现分配和释放了一次内存,无疑是getenv函数所为

songvm@ubuntu:~/works/xdn/boo$ valgrind --leak-check=yes ./opt
==6975== Memcheck, a memory error detector
==6975== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==6975== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==6975== Command: ./opt
==6975== 
Get environ variable PATH : [/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]
==6975== 
==6975== HEAP SUMMARY:
==6975==     in use at exit: 0 bytes in 0 blocks
==6975==   total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==6975== 
==6975== All heap blocks were freed -- no leaks are possible
==6975== 
==6975== For counts of detected and suppressed errors, rerun with: -v
==6975== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
songvm@ubuntu:~/works/xdn/boo$ 
  • 命令行参数的解析相对复杂一些,以后再发博文讲解!!!

相关文章:

C语言之简单的获取命令行参数和环境变量

C语言之简单的获取命令行参数和环境变量 本人的开发环境为WIN10操作系统用VMWARE虚拟的UBUNTU LINUX 18.04LTS&#xff01;&#xff01;&#xff01; 所有代码的编辑、编译、运行都在虚拟机上操作&#xff0c;初学的朋友要注意这一点&#xff01;&#xff01;&#xff01; 详细…...

STL之vecor的使用(超详解)

目录 1. C/C中的数组 1.1. C语言中的数组 1.2. C中的数组 2. vector的接口 2.1. vector的迭代器 2.2. vector的初始化与销毁 2.3. vector的容量操作 2.4. vector的访问操作 2.5. vector的修改操作 &#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏…...

SystemVerilog学习笔记(一):数据类型

在systemverilog中&#xff0c;主要包含以下数据类型&#xff1a; 4值类型2值类型数组字符串结构体和联合体枚举自定义类型 无符号数&#xff1a;无符号数的符号不使用任何标志&#xff0c;即无符号数只能存储正数。无符号二进制数的范围从 0 到 ((2^n) - 1)&#xff0c;n 表…...

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…...

每日一练 | 包过滤防火墙的工作原理

01 真题题目 包过滤防火墙对哪一层的数据报文进行检查&#xff1f; A. 应用层 B. 物理层 C. 网络层 D. 链路层 02 真题答案 C 03 答案解析 包过滤防火墙是一种基本的安全设备&#xff0c;它通过检查进出网络的数据包来决定是否允许该数据包通过。 这种类型的防火墙主要关注…...

AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案

在当今AR智能眼镜的发展中&#xff0c;显示和光学组件成为了技术攻坚的主要领域。由于这些组件的高制造难度和成本&#xff0c;其光学显示模块在整个设备的成本中约占40%。 采用光波导技术的AR眼镜显示方案&#xff0c;核心结构通常由光机、波导和耦合器组成。光机内的微型显示…...

SpringBoot(十九)创建多模块Springboot项目(完整版)

之前我有记录过一次SpringBoot多模块项目的搭建,但是那一次只是做了一个小小的测试。只是把各模块联通之后就结束了。 最近要增加业务开发,要将目前的单模块项目改成多模块项目,我就参照了一下我上次搭建的流程,发现总是有报错。上次搭建的比较顺利,很多细枝末节也没有仔细…...

Navicat 17 功能简介 | 单元格编辑器

Navicat 17 功能简介 | 单元格编辑器 本期&#xff0c;我们一起了解 Navicat 17 出色的数据操作功能的单元格编辑器。单元格编辑器支持文本、十六进制、图像和网页四种格式的数据编辑&#xff0c;位于底部的编辑器窗格&#xff0c;为你编辑更大容量的数据信息提供足够的显示和操…...

MySQL【四】

插入数据 向数据表中插入一行数据 INSERT|REPLACE INTO 表名[(字段列表)] VALUES(值列表); ########## 在s表中插入一条记录&#xff1a;学号为s011,姓名为李思&#xff0c;性别为默认值&#xff0c;计算机专业 ########## insert into s(sno,sname,dept)values(s011,李思,计…...

简单叙述 Spring Boot 启动过程

文章目录 1. 准备阶段&#xff1a;应用启动的入口2. 创建 SpringApplication 对象&#xff1a;开始启动工作3. 配置环境&#xff08;Environment&#xff09;&#xff1a;识别开发环境与生产环境4. 启动监听器和初始化器&#xff1a;感知启动的关键事件5. 创建 ApplicationCont…...

微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式

微信小程序自定义tabbar&#xff1b;禁用某个tab&#xff1b;修改某个tab的样式 原本使用本身的tabBar就已经很舒服了&#xff0c;很合适了的&#xff0c;但是总有一些脑洞大开的产品和客户&#xff0c;给你搞点多样式&#xff0c;没办法牛马就得去做咯&#xff0c;现在就给大…...

力扣113:路径总和II

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…...

JavaScript字符串常用方法

在JavaScript中&#xff0c;字符串是用来表示文本数据的基本数据类型。字符串可以用单引号()、双引号(")、或反引号()包裹。JavaScript中的字符串是不可变的&#xff0c;也就是说&#xff0c;字符串的值一旦创建就无法更改&#xff0c;但可以创建新字符串来替换原有字符串…...

xtu oj 加一

样例输入# 2 4 1 2 3 4 4 3 2 4 1样例输出# 3 5 解题思路&#xff1a;最小操作次数一定是把所有数变成数组中最大值max。 1、找最大值&#xff0c;一开始我把max初始值设为0&#xff0c;如果a[i]>max,maxa[i],WA了。又看了一遍题目&#xff0c;发现所有整数的绝对值小于…...

QTcpSocket 服务端和客户端

前提&#xff1a; pro文件中添加 QT network 服务端主要采用信号槽机制&#xff0c;代码如如下 核心代码头文件#ifndef TCPSERVER_H #define TCPSERVER_H#include <QObject>#include <QTcpServer> #include <QTcpSocket> #include <QDebug> #inclu…...

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…...

项目中用户数据获取遇到bug

项目跟练的时候 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘code’) at Proxy.userInfo (user.ts:57:17) 因此我想要用result接受信息的时候会出错&#xff0c;报错显示为result.code没有该值 导致我无法获取到相应的数据 解决如下 给…...

SpringSecurity+jwt+captcha登录认证授权总结

SpringSecurityjwtcaptcha登录认证授权总结 版本信息&#xff1a; springboot 3.2.0、springSecurity 6.2.0、mybatis-plus 3.5.5 认证授权思路和流程&#xff1a; 未携带token&#xff0c;访问登录接口&#xff1a; 1、用户登录携带账号密码 2、请求到达自定义Filter&am…...

项目技术栈-解决方案-web3去中心化

web3去中心化 Web3 DApp区块链:钱包:智能合约:UI:ETH系开发技能树DeFi应用 去中心化金融P2P 去中心化网络参考Web3 DApp 区块链: 以以太坊(Ethereum)为主流,也包括Solana、Aptos等其他非EVM链。 区块链本身是软件,需要运行在一系列节点上,这些节点组成P2P网络或者半…...

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:创新与应用

一、引言 随着科技的迅猛发展&#xff0c;声音克隆技术已经成为一个炙手可热的研究领域。SoVITS&#xff08;Sound Voice Intelligent Transfer System&#xff09;&#xff0c;作为该领域的先锋&#xff0c;凭借其卓越的性能和广泛的适用性&#xff0c;正在为多个行业带来前所…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...