【问题标题】:Getting size of command line arguments/accessing individual characters in command line arguments获取命令行参数的大小/访问命令行参数中的单个字符
【发布时间】:2014-04-17 06:28:05
【问题描述】:

提前感谢您阅读本文,

我正在通过编写一个接收一个参数并返回其大小的程序来练习从命令行获取和操作参数。根据我的阅读,每个命令行参数都以空结尾,并且每个单独的字符都可以像普通的二维数组一样访问(如果我错了,请纠正我)。于是我写了:

for (int i = 0; i > -1; i++)
{
    cout << "Doing " << &argv[1][i] << endl;
    if (&argv[1][i] != "\0") Size++;
    else break;
}

这在 g++ 下编译得很好,但是当我运行它时,会发生这种情况:

user@computer:~/Programming$ ./ReturnSize 12345
Doing 12345
Doing 2345
Doing 345
Doing 45
Doing 5
Doing 
Doing ORBIT_SOCKETDIR=/tmp/orbit-user

然后它继续运行,直到出现段错误。 我究竟做错了什么?有没有更好的方法来确定参数的大小/访问参数中的单个元素?

【问题讨论】:

  • 为什么不使用strlen(char*)?

标签: c++ linux command-line-arguments getopts


【解决方案1】:

在此声明中

if (&argv[1][i] != "\0") Size++;

您比较两个指针(字符串文字隐式转换为指向此表达式中其第一个元素的指针)。由于它们占用不同的内存区域,if 语句中的条件将始终等于 true,除非数组相互重叠。

将此语句更改为

if ( argv[1][i] != '\0' ) Size++;

要获取命令行参数的大小,您可以使用标头 &lt;cstring&gt; 中声明的标准 C 函数 std::strlen

例如

size_t Size = std::strlen( argv[1] );

至于你的循环,那么它可以写得更简单

size_t Size = 0;
while( argv[1][Size] )
{
    cout << "Doing " << &argv[1][Size] << endl;
    ++Size;
}

【讨论】:

    【解决方案2】:

    for (int i = 0; i &gt; -1; i++) 真的吗??? 一个简单的方法::

    #include<iostream>
    #include<cstdlib>
    int main(int argc, char* argv[])
    {
        for (int i = 1; i < argc; ++i)
        {
            std::string temp = argv[i];
            std::cout << temp << " | " << temp.length() << std::endl;
            Size = temp.length();
        } 
        return 0;
    }
    

    【讨论】:

    • 很好的答案,但什么是大小?循环中的最后一行应该做什么?
    【解决方案3】:

    除了整个程序有点奇怪之外(见 pippin1289 的评论),你的 if 条件是错误的:你想要:

    if (argv[1][i] != '\0')
    

    【讨论】:

      【解决方案4】:

      for 循环没有意义。你增加 i 并测试它是否大于 -1。当然如此。针对字符串“\0”进行测试与针对空字符“\0”进行测试不同。这是你麻烦的根源之一。另外,我一开始也不会费心逐个字符地循环播放。您可以将整个字符串发送到流中,或者在其上使用 C 库函数。

      【讨论】:

        【解决方案5】:

        可以计算任何布尔表达式。例如,你可以写:

        for (int i = 0; true; i++) {
        }
        

        话虽这么说,

        for (int i = 0; i argv[1][i] != '\0'; i++) {
        
        }
        

        虽然非常规,但可能会起作用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-05
          • 2014-01-03
          • 2018-06-14
          • 2022-01-19
          • 2012-09-01
          相关资源
          最近更新 更多