【问题标题】:OS X console app - cannot read the argumentsOS X 控制台应用程序 - 无法读取参数
【发布时间】:2021-09-22 12:52:47
【问题描述】:

在控制台的简单应用程序中,我无法读取参数

int main(int argc, char ** argv) {
    if (argc > 1)
        strcpy(path, argv[1]);
printf("arguments %d\n", argc);
....

argc 总是 1

从控制台运行应用程序是这样的:

open mytestconsoleapp --args arg1 arg2 arg3

argc 总是 1。这对我来说很奇怪。

我不明白为什么,有什么问题?

【问题讨论】:

  • strcpy(path, argv[1]); 你怎么能确定argv[1] 足够大以容纳path 中的所有字符(不管是什么)?
  • 为什么open在你的命令前面?
  • 您是在C 还是C++ 写这篇文章?目前看起来您正在使用C
  • 请显示minimal reproducible example,我无法让open 在我的机器上运行命令行程序
  • 或者,只是不指定十进制输出...

标签: c++ macos command-line console console-application


【解决方案1】:

如果您实际上写的是C++ 而不是C,则可以使用它。

static std::string path;

int main( int argc, char* argv[ ] ) { 
    // With either solution you should make sure that the passed in 
    // argument isn't gigantic.
    if ( argc > 1 ) { 
        path.assign( argv[ 1 ] );
        std::cout << path << '\n'
    }

    // Or you could use one of the std::string constructors.
    // This is a nice solution if you don't require global state.
    if ( argc > 1 ) { 
        std::string buffer{ argv[ 1 ] };
        std::cout << buffer << '\n';
    }
}

如果您在 C 中执行此操作,请使用:

static char path[ 256 ];

int main( int argc, char* argv[ ] ) {
    if ( argc > 1 ) { 
        strncpy( path, argv[ 1 ], sizeof( path ) - 1 );
        printf( "%s\n", path );
    }
    
    // Or if you don't need the global variable.
    if ( argv > 1 ) { 
        char buffer[ 256 ] = { 0 };
        strncpy( buffer, argv[ 1 ], sizeof( buffer ) - 1 );
        printf( "%s\n", buffer );
    }
}

然后使用以下命令运行您的应用程序:./mytestconsoleapp test

【讨论】:

  • 为什么要将path 设为全局变量?全局变量不好,在这里没有必要
  • @AlanBirtles 因为我试图模仿我认为OP 正在使用的东西(他没有向我们展示太多)。但我 100% 同意不需要全局变量。我也会使用本地缓冲区更新 C 示例。
  • 命令行错误...我不明白为什么它不能与 open 一起使用,我指定可执行文件在另一台 PC 上,我从网络调用它。我使用了 Wbuck 提出的命令行,它可以工作。谢谢。 C++ 代码没问题
【解决方案2】:

行为是正确的。你的程序没有问题。但是,%d 是十进制的格式字符串。

我建议你试试%s

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 2011-06-05
    • 2012-07-27
    • 2015-08-17
    • 2018-02-19
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多