getopt_long接收到的参数,试着打印出来

本文详细介绍了getopt_long函数的使用方法及内部实现原理。通过示例代码展示了如何利用此函数处理命令行参数,并解释了关键步骤的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

getopt_long接收到的参数,试着打印出来 - 加菲 -  .
 
添加的代码如下:
 

 

getopt_long接收到的参数,试着打印出来 - 加菲 -  .
 
 
 {
 int retval;
 int ti;//zjh
 char *tm;
 tm = nargv;
 _DIAGASSERT(nargv != NULL);
 _DIAGASSERT(options != NULL);
 _DIAGASSERT(long_options != NULL);
 /* idx may be NULL */
 printf("getopt_long函数被调用,本函数第1个参数nargc=%d \n",nargc);//zjh
 for (ti=0;ti<nargc;ti++)
 {
  printf("getopt_long函数被调用,本函数第2个参数nargv=%s \n",*nargv);//zjh
  nargv++;
 }
 nargv = tm;//zjh 
 printf("getopt_long函数被调用,本函数第3个参数options=%s \n",options);//zjh
 if ((retval = getopt_internal(nargc, nargv, options)) == -2) //internal:内部的//前两个参数对应于main(...),第三个即为冒号分隔的字符串
 {

 记的nargv = tm;//zjh 是在一开始把nargv的首地址记下,在对nargv++后,要还原回去,不然后面的地址就是错的了,其实应该拷贝一份出来,不是很熟悉,所以偷懒一下了。

打印的结果如预期,是一个向量,或者叫长字符串吧,中间各参数是用空格分隔的:

其实我输入的测试命令是“x264 --crf 22  -o test.264 hall_cif.yuv 352x288”,可以看到,它把这些以空格为分隔循环打印了出来啦。


 

#include<stdio.h> #include<string.h> #include<stdlib.h> #include"getopt.h" #define MAX 1024 long long apply(long long x, long long y, char op) { long long result; result = 0; switch (op){ case '+': result = x + y; break; case '-': result = x - y; break; case '*': result = x * y; break; case '/': if (y == 0) { printf("除数不能为零\n"); } else { result = x / y; } break; default: printf("运算符不符合要求\n"); break; } if (result > 9999999999 || result < -9999999999) { printf("输出结果超限\n"); return 0; }else { return result; } } int pre(char op) { int t; switch (op){ case '+': t = 1; break; case '-': t = 1; break; case '*': t = 2; break; case '/': t = 2; break; default: return 0; break; } return t; } void print_help() { printf("输入:-i 输入算式\n"); printf("-h 显示帮助信息\n"); printf("-i 输入字符串(其中数字大小范围为-999999999-999999999)\n"); } long long count(char* str) { long long number[MAX] = {0}; char symbol[MAX] = {0}; int num_top; int sym_top; int len; int i; long long a; long long b; char op; num_top = -1; sym_top = -1; len = strlen(str); i = 0; for (i = 0;i < len;i++) { if (isdigit(str[i])) { long long num = 0; while (i < len && isdigit(str[i])) { num = num * 10 + (str[i] - '0'); i++; } i--; number[++num_top] = num; }else if (str[i] == '(') { sym_top++; symbol[sym_top] = str[i]; }else if (str[i] == ')') { while (sym_top >= 0 && symbol[sym_top] != '(') { b = number[num_top--]; a = number[num_top--]; op = symbol[sym_top--]; num_top++; number[num_top] = apply(a, b, op); } sym_top--; }else { while (sym_top >= 0 && pre(str[i]) <= pre(symbol[sym_top])) { b = number[num_top--]; a = number[num_top--]; op = symbol[sym_top--]; num_top++; number[num_top] = apply(a, b, op); } sym_top++; symbol[sym_top] = str[i]; } } while (sym_top >= 0) { b = number[num_top--]; a = number[num_top--]; op = symbol[sym_top--]; num_top++; number[num_top] = apply(a, b, op); } return number[num_top]; } int main(int argc, char* argv[]) { int opt; char* str=NULL; while ((opt = getopt(argc, argv, "hs:")) != -1) { switch (opt) { case 'h': print_help(); break; case 's': str = optarg; break; case '?': printf("无效选项%c\n", opt); break; case ':': printf("选项%c缺少参数\n", optopt); break; default: printf("非法解析\n"); break; } } printf("计算结果为:%lld", count(str)); return 0; }请添加算式格式判断
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值