精华内容
下载资源
问答
  • c语言+命令行参数In this article, we’ll be looking at how we can use command line arguments in C / C++. 在本文中,我们将研究如何在C / C ++中使用命令行参数。 Command Line arguments are very useful if ...

    c语言+命令行参数

    In this article, we’ll be looking at how we can use command line arguments in C / C++.

    在本文中,我们将研究如何在C / C ++中使用命令行参数。

    Command Line arguments are very useful if you want to pass any input strings to your main program, from the command line.

    如果要从命令行将任何输入字符串传递到主程序,则命令行参数非常有用。

    These arguments are passed as parameters to the main() function.

    这些参数作为参数传递给main()函数。

    Let’s look at how we can use these effectively.

    让我们看看如何有效地使用它们。



    为什么要使用命令行参数? (Why should we use command line arguments?)

    Often, it is very convenient for us to directly give input to our program. One common way is to use scanf() / getchar(), etc to wait for a user input.

    通常,对于我们而言,直接向程序提供输入非常方便。 一种常见的方法是使用scanf() / getchar()等来等待用户输入。

    But, these calls waste a lot of time in waiting, and requires the user to manually enter the input.

    但是,这些呼叫浪费大量时间等待,并且需要用户手动输入输入。

    We can save a lot of time by simply giving these inputs to our main program!

    通过将这些输入提供给我们的主程序,我们可以节省大量时间!

    The format will be something like:

    格式如下:

    
    ./executable input1 input2
    

    The program will automatically store those command-line arguments in special variables, from which we can access them directly!

    该程序将自动将这些命令行参数存储在特殊变量中,我们可以从中直接访问它们!

    This will only require a one time input, given when we start our program.

    启动程序时,只需输入一次即可。

    Let’s look at how we can use them now.

    让我们看看现在如何使用它们。

    C / C ++中的命令行参数–特殊变量 (Command Line Arguments in C/C++ – The special variables)

    The program will pass the command line arguments to the main() function.

    该程序会将命令行参数传递给main()函数。

    In C / C++, the main() function takes in two additional parameters for these arguments.

    在C / C ++中,main()函数为这些参数引入了两个附加参数。

    • argc -> Argument Count. Gives the number of arguments that we pass (includes the program name also)

      argc >参数计数。 给出我们传递的参数数量(还包括程序名称)
    • argv -> Argument Vector. This is a char* array of strings. These are the argument values itself.

      argv >参数向量。 这是一个char*字符串数组。 这些是参数值本身。

    So, argv[0] is the name of the program itself, and argv[1]argv[argc-1] will be all our command line arguments.

    因此, argv[0]是程序本身的名称,而argv[1]argv[argc-1]将是我们的所有命令行参数。

    
    int main(int argc, char* argv[]);
    

    To see this in action, let’s take an example.

    为了了解这一点,让我们举个例子。



    使用命令行参数–一个简单的例子 (Using command line arguments – A simple example)

    Let’s consider a program which concatenates two strings, given as input.

    让我们考虑一个程序,该程序将两个字符串作为输入给出。

    We’ll pass in two command line arguments to our program, so our total argc must be 3 (including the program name).

    我们将两个命令行参数传递给我们的程序,因此我们的总argc必须为3(包括程序名)。

    We can write our program like this:

    我们可以这样编写程序:

    
    #include <iostream> 
    #include <string>
    
    using namespace std;
    
    string concat_strings(string s1, string s2) {
        return s1 + s2;
    }
    
    int main(int argc, char* argv[]) 
    { 
        cout << "You have entered " << argc 
             << " arguments:" << "\n";
    
        if (argc != 3) {
            cerr << "Program is of the form: " << argv[0] << " <inp1> <inp2>\n";
            return 1;
        } 
    
        string result = concat_strings(argv[1], argv[2]);
    
        cout << "Result: " << result << endl;
    
        return 0; 
    } 
    

    If our executable name was test.out, on my linux machine, I run the executable using this command:

    如果我们的可执行文件名为test.out ,则在我的Linux机器上,我使用以下命令运行可执行文件:

    
    ./test.out Hello _JournalDev
    

    Notice that the arguments are space-separated. So our command-line arguments are: “Hello” and “_JournalDev”

    请注意,参数以空格分隔。 因此,我们的命令行参数为:“ Hello”和“ _JournalDev”

    Output

    输出量

    
    You have entered 3 arguments:                                                                                                
    Result: Hello_JournalDev
    

    Great! This seems to work as expected, since the first argument is the name of the program itself.

    大! 这似乎按预期工作,因为第一个参数是程序本身的名称。

    Let’s try to run this with 4 arguments now.

    现在让我们尝试使用4个参数运行它。

    
    ./test.out Hello from JournalDev
    

    Output

    输出量

    
    You have entered 4 arguments:                                                                                                
    Program is of the form: ./test.out <inp1> <inp2>
    

    Indeed, it gives us the correct error message!

    确实,它为我们提供了正确的错误消息!



    结论 (Conclusion)

    Hope this article gives you a better understanding of command line arguments. We saw how we can use it to make our lives easier!

    希望本文能使您对命令行参数有更好的了解。 我们看到了如何使用它来使我们的生活更轻松!

    For similar content, do go through our tutorial section on C++ programming.

    对于类似的内容,请阅读我们有关C ++编程的教程部分

    参考资料 (References)



    翻译自: https://www.journaldev.com/41869/command-line-arguments-c-plus-plus

    c语言+命令行参数

    展开全文
  • C语言的变长参数在平时做开发时很少会在自己设计的接口中用到,但我们最常用的接口printf就是使用的变长参数接口,在感受到printf强大的魅力的同时,是否想挖据一下到底printf是如何实现的呢?这里我们一起来挖掘...
  • C语言可变参数详解

    千次阅读 多人点赞 2018-12-31 22:46:06
    C语言可变参数详解 什么是可变参数函数 在C语言编程中有时会遇到一些参数可变的函数,例如printf()、scanf(),其函数原型为: int printf(const char* format,…) int scanf(const char *format,…) 就拿 printf 来...

    C语言可变参数详解

    什么是可变参数函数

    在C语言编程中有时会遇到一些参数可变的函数,例如printf()、scanf(),其函数原型为:

    int printf(const char* format,)
    int scanf(const char *format,)
    

    就拿 printf 来说吧,它除了有一个参数 format 固定以外,后面的参数其个数和类型都是可变的,用三个点“…”作为参数占位符。

    参数列表的构成

    任何一个可变参数的函数都可以分为两部分:固定参数和可选参数。至少要有一个固定参数,其声明与普通函数参数声明相同;可选参数由于数目不定(0个或以上),声明时用"…"表示。固定参数和可选参数共同构成可变参数函数的参数列表。

    实现原理

    C语言中使用 va_list 系列变参宏实现变参函数,此处va意为variable-argument(可变参数)。

    x86平台VC6.0编译器中,stdarg.h头文件内变参宏定义如下:

    typedef char * va_list;
    
    // 把 n 圆整到 sizeof(int) 的倍数
    #define _INTSIZEOF(n)       ( (sizeof(n)+sizeof(int)-1) & ~(sizeof(int)-1) )
    
    // 初始化 ap 指针,使其指向第一个可变参数。v 是变参列表的前一个参数
    #define va_start(ap,v)      ( ap = (va_list)&v + _INTSIZEOF(v) )
    
    // 该宏返回当前变参值,并使 ap 指向列表中的下个变参
    #define va_arg(ap, type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )
    
    // /将指针 ap 置为无效,结束变参的获取
    #define va_end(ap)             ( ap = (va_list)0 )
    

    _INTSIZEOF(n)

    _INTSIZEOF宏考虑到某些系统需要内存地址对齐。从宏名看应按照sizeof(int)即栈粒度对齐,参数在内存中的地址均为sizeof(int)=4的倍数。

    例如,若1≤sizeof(n)≤4,则_INTSIZEOF(n)=4;若5≤sizeof(n)≤8,则_INTSIZEOF(n)=8

    va_start(ap,v)

    va_start宏首先根据(va_list)&v得到参数 v 在栈中的内存地址,加上_INTSIZEOF(v)即v所占内存大小后,使 ap 指向 v 的下一个参数。在使用的时候,一般用这个宏初始化 ap 指针,v 是变参列表的前一个参数,即最后一个固定参数,初始化的结果是 ap 指向第一个变参。

    va_arg(ap, type)

    这个宏取得 type 类型的可变参数值。首先ap += _INTSIZEOF(type),即 ap 跳过当前可变参数而指向下个变参的地址;然后ap-_INTSIZEOF(type)得到当前变参的内存地址,类型转换后解引用,最后返回当前变参值。

    va_end(ap)

    va_end 宏使 ap 不再指向有效的内存地址。该宏的某些实现定义为((void*)0),编译时不会为其产生代码,调用与否并无区别。但某些实现中 va_end 宏用于在函数返回前完成一些必要的清理工作:如 va_start 宏可能以某种方式修改栈,导致返回操作无法完成,va_end 宏可将有关修改复原;又如 va_start 宏可能为参数列表动态分配内存以便于遍历,va_end 宏可释放此内存。因此,从使用 va_start 宏的函数中退出之前,必须调用一次 va_end 宏。

    代码示例

    变参宏无法智能识别可变参数的数目和类型,因此实现变参函数时需自行判断可变参数的数目和类型。所以我们就要想一些办法,比如

    1. 显式提供变参数目或设定遍历结束条件
    2. 显式提供变参类型枚举值,或在固定参数中包含足够的类型信息(如printf函数通过分析format字符串即可确定各变参类型)
    3. 主调函数和被调函数可约定变参的数目和类型

    例1:函数通过固定参数指定可变参数个数,打印所有变参值。

    #include <stdarg.h>
    #include <stdio.h>
    
    void parse_valist_by_num(int arg_cnt, ...);
    
    int main(void)
    {
        parse_valist_by_num(4,1,2,3,4);
        parse_valist_by_num(4,1,2,3); 
        parse_valist_by_num(4,1,2,3,4,5); //多余的变参被忽略
    }
    
    
    //第一个参数定义可变参数的个数
    void parse_valist_by_num(int arg_cnt, ...)
    {
        
        va_list p_args;
        va_start(p_args, arg_cnt);
        
        int idx;
        int val;
        
        for(idx = 1; idx <= arg_cnt; ++idx){
            val = va_arg(p_args, int);
            printf("第 %d 个参数: %d\n", idx, val);
        }
        printf("---------------\n");
        va_end(p_args);
    }
    

    运行结果如下:

    在这里插入图片描述

    注意第2个结果,第4个参数是一个魔数,这是因为打印出了栈中参数3上方的参数值。

    例2:函数定义一个结束标记(-1),调用时通过最后一个参数传递该标记,打印标记前所有变参值。

    #include <stdarg.h>
    #include <stdio.h>
    
    void parse_valist_by_flag(int num_1, ...);
    
    int main(void)
    {
        parse_valist_by_flag(1,-1);
        parse_valist_by_flag(1,2,3,5,-1);
        parse_valist_by_flag(-1);
        
    }
    
    //函数定义一个结束标记(-1),调用时通过最后一个参数传递该标记,以结束变参的遍历打印。
    //最后一个参数作为变参结束符(-1),用于循环获取变参内容
    void parse_valist_by_flag(int num_1, ...)
    {
        va_list p_args;
        va_start(p_args, num_1);
        int idx = 0;
        int val = num_1;
        while(val != -1){
            ++idx;
            printf("第 %d 个参数: %d\n", idx, val);
            val = va_arg(p_args, int); //得到下个变参值
        }
        va_end(p_args);
        printf("---------------\n");
    }
    

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

    需要注意

    va_arg(ap, type)宏中的 type 不可指定为以下类型:

    • char
    • short
    • float

    在C语言中,调用不带原型声明或声明为变参的函数时,主调函数会在传递未显式声明的参数前对其执行缺省参数提升(default argument promotions),将提升后的参数值传递给被调函数。

    ​ 提升操作如下:

    • float 类型的参数提升为 double 类型
    • char、short 和相应的 signed、unsigned 类型参数提升为 int 类型
    • 若 int 类型不能容纳原值,则提升为 unsigned int 类型

    最后来一张图,帮助大家理解前文讲的宏。

    在这里插入图片描述

    【完】

    参考资料

    https://www.cnblogs.com/clover-toeic/p/3736748.html

    展开全文
  • C语言函数作为函数参数

    万次阅读 多人点赞 2019-09-13 11:35:15
    c,c++中是可以向Python那样将函数作为函数参数的,具体实现方法如下

    C语言函数作为参数

    为了满足DRY思想,减少代码的重复性,考虑将函数作为参数传入另一函数中。C语言是可以将函数作为函数参数的。
    用到的方法是函数指针。
    首先需要明确的是, 在C语言中,函数名就是函数的首地址,所以将函数作为函数参数的思路是将函数地址传入,形参是一个指针类型的变量,形参的基类型为函数原型。
    参数原型为:
    ElemType(*FunctionName)(ElemType, ElemType, ......)
    其中:ElemType为声明(如int, float, double,struct等)
    以冒泡排序为例借助判断大小函数进行数组排序的具体实现方法如下:

    #include <stdio.h>
    
    #define YES 1
    #define NO 0
    
    ///*判断函数,进行元素大小判断,increase判断大小比较*/
    int compare(int a, int b, int increase)
    {
    	if (increase > 0) {
    		if (a > b) return YES;
    		else return NO;
    	}
    	else
    	{
    		if (a < b)  return YES;
    		else return NO;
    	}
    }
    /*冒泡排序进行数组排序*/
    void OrderArr(int arry[], int(*compare)(int, int, int), int length, int increase = 1)
    {
    	for (int i = 0; i < length - 1; i++)
    	{
    		for (int j = 0; j < length - i - 1; j++)
    		{
    			if (compare(*(arry + j), *(arry + j + 1), increase))
    			{
    				int temp = *(arry + j + 1);
    				*(arry + j + 1) = *(arry + j);
    				*(arry + j) = temp;
    			}
    		}
    	}
    }
    
    /*输出函数*/
    void Print(int a[], int length)
    {
    	for (int i = 0; i < length; i++)
    	{
    		printf("%d ", *(a + i));
    	}
    	printf("\n");
    }
    
    int main()
    {
    	int a[5] = { 1, 4, 2, 6, 3 };
    	//增序排列数组
    	OrderArr(a, compare, 5);
    	Print(a, 5);
    	//降序排列数组
    	OrderArr(a, compare, 5, -1);
    	Print(a, 5);
    }
    
    展开全文
  • 用塔层数和原在塔座名、目标塔座名三个的参数c语言程序,解决了什么要借助、怎么借助的,借助后又如何等等问题,同时也说明了与现有四参数程序的关系。
  • [C语言] 命令行参数

    2019-08-19 00:51:42
    例如,test.c是一个简单的C语言源程序: #include<stdio.h> int main(void) { printf("Hello world\n"); return 0; } 经过编译和连接后,生成可执行程序test.exe,它可以直接在Windows环境下以...

    不带命令行参数

    C语言源程序经编译和连接处理,生成可执行程序后,才能运行。例如,test.c是一个简单的C语言源程序:

    #include<stdio.h>
    int main(void)
    {
        printf("Hello world\n");	
        return 0;
    }
    

    经过编译和连接后,生成可执行程序test.exe,它可以直接在Windows环境下以命令方式运行。比如,将其放到桌面,在DOS中,输入test即可运行:
    在这里插入图片描述

    带命令行参数

    输入命令时,在可执行文件(命令)名后面可以跟一些参数(命令行参数),一般形式为:

    命令名 参数1 参数2 … 参数n
    

    命令名和参数之间用空格分隔,也可以没有参数。

    在C语言中,主函数main()可以有两个参数,用于接收命令行参数。带参数的main()习惯写法为:

    int main(int argc, char* argv[])
    {
    	// …
     }
    

    第一个参数argc(argument count)用于接收命令行参数(包含命令)的个数;第二个参数argv(argument vector)接收以字符串常量形式存放的命令行参数(包括命令本身也作为一个参数)。字符指针数组argv[]表示各个命令行参数(包含命令),其中argv[0]指向命令,argv[1]指向第一个命令行参数,argv[2]指向第二个命令行参数,…,argv[argc-1]指向最后一个命令行参数.

    应用

    编写程序echo,输出所有命令行参数在同一行上。

    #include<stdio.h>
    int main(int argc, char* argv[])
    {
    	int k;
    	for(k = 1; k < argc; k++)
    		printf("%s ", argv[k]);
    	printf("\n");
    	
    	return 0;
     } 
    

    输入:echo Hello world
    输出:Hello world
    在这里插入图片描述
    由于argv是函数main()的形参,尽管定义时一般写成数组形式,但实际上还是指针,在程序中可以直接改变它的值。上面echo.c中的循环也可以写成:

    	for(k=1,argv++;k<argc;k++)
    	    printf("%s ",*(argv++));
    

    注意有坑:Windows自带echo,建议保存C程序源文件时对文件名进行修改,不使用echo,或者在命令行使用echo.exe hello world避免直接调用系统的echo。

    展开全文
  • C语言main函数的参数

    千次阅读 多人点赞 2019-08-04 07:56:56
    在我们之前编写的C程序中,main函数是没有参数的,但是在实际开发中,main函数一般都需要参数,没有参数的情况极少。 main函数的参数是从命令提示符下执行程序的时候传入,例如ls 命令。 在以上示例中ls命令...
  • C语言函数的参数

    千次阅读 2019-03-21 23:07:27
    一、函数的参数可以是变量、变量指针和变量引用: void funcA(int8_t x) { x=x+1; } 代码说明:该函数的参数属于值传递,在调用该函数时,仅仅只是把实参的值拷贝了一份赋值给了形参x,之后的任何操作都不会影响到...
  • C语言 | 函数参数

    2021-04-15 08:44:38
    C语言函数参数 C语言函数的参数可以是变量、变量指针和变量引用。 //如下 #include<stdio.h> int maxNumber(int x,int y); //此处括号里的x y是形式参数 int main() { int num1,num2; scanf("%d %d",&...
  • C语言 二维数组作为函数参数的4种方式

    千次阅读 多人点赞 2020-08-10 20:59:06
    前言 多维数组中,二维数组是最常用的一种。...话不多说,下面将给出一个C程序,以展示二维数组作为函数参数的4种方式。注:下面的代码已在VS Code(使用Mingw64)和VS 2015下编译运行过。 正文 下面程序的功
  • 本文主要讲了c语言指针变量作为函数参数传递,下面一起来学习一下
  • C语言获取命令行参数

    2020-05-09 13:08:39
    在开发过程中,经常会出现要获取命令行参数的场景,例如文本编辑器,数据库等等。其实实现起来也很简单,这样就可以。 int main(int argc,char *argv[]){ return 0; } 其中,argc是参数的总数,argv是参数数组。 ...
  • C语言 可变参数及printf函数的实现
  • C/C++编程中,系统提供给编程人员的va函数很少。*printf()/*scanf()系列函数,用于输入输出时格式化字符串;exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[])算不算呢,与其说main()也是一个...
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • C语言当中的实际参数及形式参数

    千次阅读 2019-04-02 14:23:10
    这就涉及到了C语言中函数的参数问题. 函数的参数 实际参数(实参):实参是真实传给函数的参数,实参可以是常量,变量,表达式,函数等.但无论实参是那种类型的量,在进行函数调用时,他们都必须要有确定的值,以便于将这些...
  • 本篇文章是对用c语言根据可变参数合成字符串的方法进行了详细的分析介绍,需要的朋友参考下
  • c语言在写函数时,如果不确定要输入多少参数,标准库提供了一种方式输入任意长度参数。 二、使用方法 1、添加头文件:#include <stdarg.h> 2、定义:参数上面用“…”代表任意个参数,省略号之前的那个参数是 ...
  • 函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收。类似的方式...
  • c语言 默认参数Default arguments are the arguments that are passed in the function definition which is used by the compiler if no arguments are provided, at the time of function call. 默认参数是在函数...
  • C语言字符串做函数参数

    千次阅读 2020-10-30 09:03:15
    C语言字符串做函数参数 深入理解指针 一维字符串内存模型:两种 典型错误知多少 深入理解指针 注意 指针和数组的巨大区别 char *p = “abcdefg”; Char *buf = “abcdefg”; 一维字符串内存模型:两种 void copy_str...
  • 这个不是现成的工具,而是具体的C语言代码功能实现。利用C语言实现了大地坐标系和空间直角坐标系的相互转换,以及求解七参数的值的方法。
  • C语言命令行参数详解

    万次阅读 多人点赞 2018-02-10 12:38:44
    C语言的main函数通常含有参数argc和argv,写法通常如下: int main(int argc,char *argv[]) int main(int argc,char **argv) 下面详细解释一下这两个参数: argc : 命令行传入参数的总个数 argv : *argv[]...
  • C编译器报错:存在正文时不允许未命名的原型参数报错如图解决方法 报错如图 解决方法
  • IIR滤波器,C语言源码,直接可以用,参数可以改,用之前可以考虑你传感器采样的频率,将IIR滤波器放在不同的位置,中断,定时器
  • 形参-实参
  • void表示没有函数参数,这里函数参数什么意思,最好可以举个例子,谢谢
  • C语言:通过指针传递参数

    千次阅读 2019-04-30 17:20:54
    } 在参数列表的每个形参前面添加了一个星号(*),表示是一个指针,即对应该参数的实参应该是一个保存相同类型数据的地址。 第16~23行定义函数swap0,在该函数的代码中,也使用了指针运算符。使用指针运算符取得传入...
  • C语言函数返回值与参数传递

    千次阅读 2019-10-26 11:57:43
    C语言函数返回值与参数传递 一:参数传递 C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,885,540
精华内容 1,554,216
关键字:

参数c