24小时热门版块排行榜    

查看: 2061  |  回复: 6

sciencejoy

新虫 (著名写手)

[交流] C++从命令行读取参数 已有6人参与

在科学计算中,用户经常需要在程序运行的时候设置一些参数,用户可以在命令行达到此目的。

比如要用有限差分法计算一条棒的温度分布,用户需要设置棒的热导率、差分网格的节点数目。
CODE:
#include <iostream>
#include <cstdlib>

int main(int argc, char *argv[])
{
     std::cout << "Number of command line arguments = "
                   << argc << "\n";

     for (int i=0; i<argc; i++)
     {
         std::cout  << "Argument " << i << " = " << argv[i];
          std::cout << "\n";
      }

      std::string program_name = argv[0];
      int number_of_nodes = atoi(argv[1]);
      double conductivity = atof(argv[2]);
       std::cout << "Program name = " << program_name << "\n";
       std::cout << "Number of nodes = " << number_of_nodes;
       std::cout << "\n";
       std::cout << "Conductivity = " << conductivity << "\n";

        return 0;
}

如果计算需要100个节点,热导率为5.0,程序可执行文件名为CommandLineCode,在命令行输入
CODE:
./CommandLineCode 100 5.0

argc存储命令行输入的量的数目,在这个例子里为3,分别为./CommandLineCode,整数 100,浮点数 5.0,分别存储在argv[0],argv[1],argv[2]。函数 atoi(argv[1])把存储在argv[1]的字符转换成整型变量,atof(argv[2])把argv[2]转换成浮点变量。函数atoi和atof需要头文件cstdlib。

[ Last edited by sciencejoy on 2014-2-22 at 20:57 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yaozhq

金虫 (小有名气)

★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
jjdg: 编辑内容 2014-02-23 00:44
jjdg: 金币+1, 感谢参与 2014-02-23 00:45:04
如果考虑linux下计算的话 gnu的getopt更好用一些
CODE:
#include <ctype.h>
     #include <stdio.h>
     #include <stdlib.h>
     #include <unistd.h>
     
     int
     main (int argc, char **argv)
     {
       int aflag = 0;
       int bflag = 0;
       char *cvalue = NULL;
       int index;
       int c;
     
       opterr = 0;
     
       while ((c = getopt (argc, argv, "abc:")) != -1)
         switch (c)
           {
           case 'a':
             aflag = 1;
             break;
           case 'b':
             bflag = 1;
             break;
           case 'c':
             cvalue = optarg;
             break;
           case '?':
             if (optopt == 'c')
               fprintf (stderr, "Option -%c requires an argument.\n", optopt);
             else if (isprint (optopt))
               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
             else
               fprintf (stderr,
                        "Unknown option character `\\x%x'.\n",
                        optopt);
             return 1;
           default:
             abort ();
           }
     
       printf ("aflag = %d, bflag = %d, cvalue = %s\n",
               aflag, bflag, cvalue);
     
       for (index = optind; index < argc; index++)
         printf ("Non-option argument %s\n", argv[index]);
       return 0;
     }

Here are some examples showing what this program prints with different combinations of arguments:
     % testopt
     aflag = 0, bflag = 0, cvalue = (null)
     
     % testopt -a -b
     aflag = 1, bflag = 1, cvalue = (null)
     
     % testopt -ab
     aflag = 1, bflag = 1, cvalue = (null)
     
     % testopt -c foo
     aflag = 0, bflag = 0, cvalue = foo
     
     % testopt -cfoo
     aflag = 0, bflag = 0, cvalue = foo
     
     % testopt arg1
     aflag = 0, bflag = 0, cvalue = (null)
     Non-option argument arg1
     
     % testopt -a arg1
     aflag = 1, bflag = 0, cvalue = (null)
     Non-option argument arg1
     
     % testopt -c foo arg1
     aflag = 0, bflag = 0, cvalue = foo
     Non-option argument arg1
     
     % testopt -a -- -b
     aflag = 1, bflag = 0, cvalue = (null)
     Non-option argument -b
     
     % testopt -a -
     aflag = 1, bflag = 0, cvalue = (null)
     Non-option argument -

考虑跨平台的话可以用boost

[ Last edited by jjdg on 2014-2-23 at 00:44 ]
2楼2014-02-22 23:52:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

旋转的月

金虫 (正式写手)

不明觉厉。先收藏。
3楼2014-02-23 00:57:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
4楼2014-02-23 16:06:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (文坛精英)


小木虫: 金币+0.5, 给个红包,谢谢回帖
本帖仅楼主可见
5楼2014-02-23 21:10:57
已阅   申请程序强帖   回复此楼   编辑   查看我的主页

quick25

新虫 (初入文坛)

牛人 支持
6楼2014-02-23 22:24:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

酒红色果糖

新虫 (初入文坛)

感觉老师讲的怎么一点意思都没有

[ 发自小木虫客户端 ]
7楼2014-02-26 07:56:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sciencejoy 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 准备明年的基金了 +7 Tide man 2026-07-27 7/350 2026-08-02 16:43 by gltch
[公派出国] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 cBGhfJFuNMca 2026-08-02 9/450 2026-08-02 16:32 by jHcrHMhbKCFV
[博后之家] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +3 cBGhfJFuNMca 2026-08-02 15/750 2026-08-02 16:31 by jHcrHMhbKCFV
[考博] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 cBGhfJFuNMca 2026-08-02 13/650 2026-08-02 16:27 by jHcrHMhbKCFV
[找工作] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 cBGhfJFuNMca 2026-08-02 19/950 2026-08-02 16:24 by jHcrHMhbKCFV
[博后之家] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 cBGhfJFuNMca 2026-08-02 19/950 2026-08-02 16:23 by jHcrHMhbKCFV
[公派出国] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 cBGhfJFuNMca 2026-08-02 15/750 2026-08-02 16:23 by jHcrHMhbKCFV
[基金申请] 面上提前没消息,有中的吗 +9 archvillain 2026-08-02 11/550 2026-08-02 15:44 by alexon
[找工作] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 cBGhfJFuNMca 2026-08-02 16/800 2026-08-02 13:34 by jHcrHMhbKCFV
[基金申请] 2026年国自然面上资助率 +15 布布和一二 2026-07-30 21/1050 2026-08-02 10:56 by iaeyuan
[教师之家] 基础研究怎么拉横向,学校到款任务越来越多,难以完成 拉横向,都有哪些途径啊 +8 锦衣卫寒战 2026-07-28 10/500 2026-08-02 10:00 by 锦衣卫寒战
[考博] 2027年申博 50+3 射雕英雄胜 2026-07-30 3/150 2026-08-02 09:36 by lfy8008
[有机交流] 一个有机合成实验室都需要哪些设备? 50+3 kf2781974 2026-07-31 7/350 2026-08-02 07:59 by 88817753
[基金申请] 微信指数没变化,科研之友没阅读 +14 wangze12014 2026-07-28 18/900 2026-07-31 18:35 by lzchaihuo
[高分子] HXDI做水性聚氨酯乳液,是不是特别容易出渣 15+3 yuyusuv 2026-07-29 3/150 2026-07-31 09:21 by huizingga
[基金申请] 系统今天又提示维护了,估计离放榜不远了 +11 winnerche 2026-07-29 15/750 2026-07-30 23:08 by jnhyjjm
[基金申请] 你们的时间戳变了吗 +3 archvillain 2026-07-30 4/200 2026-07-30 18:53 by levinzhwen
[有机交流] 产物和副产物价值比较 30+4 小汤02 2026-07-27 5/250 2026-07-30 12:44 by czyzsu
[基金申请] 这种情况还有戏吗 +5 drbart 2026-07-27 11/550 2026-07-29 05:50 by drbart
[基金申请] 同事接到电话了,我却没有 +4 1234567wang 2026-07-27 4/200 2026-07-28 10:11 by GOODLUCKER
信息提示
请填处理意见