【问题标题】:Get the number of elements in a pointer to a char array in C++获取指向 C++ 中 char 数组的指针中的元素数
【发布时间】:2009-11-23 06:23:15
【问题描述】:

我意识到这是一个令人难以置信的菜鸟问题,但我已经用谷歌搜索了它,但似乎找不到答案(可能是因为我的问题措辞错误......如果我有,请随时修复)

所以我有这个代码:

int main(int argc, char* argv[])
{
    puts(argv[1]);
    return 0;
}

如果我将参数传递给我的程序,它工作正常,但如果我没有,那么显然它会失败,因为它试图索引数组中不存在的元素。

如何在我的字符串数组中找到多少个元素?

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    这就是argc 的用途。它保存argv 中的元素数量。尝试编译并运行:

    #include <stdio.h>
    int main(int argc, char* argv[]) {
        int i;
        if (argc < 2) {
            printf ("No arguments.\n");
        } else {
            printf ("Arguments:\n");
            for (i = 1; i < argc; i++) {
                printf ("   %d: %s\n", i, argv[i]);
            }
        }
        return 0;
    }
    

    测试运行:

    pax> ./prog
    No arguments.
    pax> ./prog a b c
    Arguments:
       1: a
       2: b
       3: c
    

    argv 数组的范围从argv[0](用于调用程序的名称,如果不可用,则为“”)到argv[argc-1]。第一个参数其实在argv[1]

    C++ 标准实际上要求 argv[argc] 为 0(一个 NULL 指针),因此您可以完全忽略 argc 并直接遍历 argv 数组,直到找到 NULL。

    【讨论】:

    • 哦。我不敢相信我没有看到……我现在觉得自己像个白痴:(
    • int *pKsEnd = (int *) calloc(strlen(pString), sizeof(int));。我想知道存储在这个内存块中的元素数量。我怎么知道?因为sizeof(pKsEnd) 将始终在我的机器上返回4编辑:你也应该知道我将它用作数组,这会影响我的程序吗?
    • @barnes,这是一个问题,而不是评论。如果以前没有被问过,我建议将其作为一个问题提出,以便获得更多曝光。但是,由于之前被问过,我建议您搜索 SO,您会在其中找到类似 stackoverflow.com/questions/1598773/… 的答案。
    • UNION 技巧真的很棒。但我有一个想法,我认为这很麻烦。因为,我使用calloc 来分配内存,所以每个块都将被初始化为0。现在我可以使用循环来查找符合条件的长度:while(pKsEnd[r] != 0){ printf("%i", pKsEnd[r++]); }。我真的不确定是否使用它。可能是您的崇高建议可以帮助我。
    • @barnes,我不会那样做,有 no 保证分配块之后的内存将非零,并且取消引用超出的内存是未定义的行为你要求什么。因此,即使您可以发现自己已经超越了终点,您会发现自己已经超越了终点:-)
    【解决方案2】:

    argc 就是这样。

    for (int j = 0;  j < argc;  ++j)
        puts (argv [j]);
    return 0;
    

    这将正确打印所有参数/

    【讨论】:

      【解决方案3】:

      argc 是多个参数。请注意,您的应用名称也是一个参数;-)

      【讨论】:

      • 技术上 argv[0] 必须注意应用名称。它是一个特定于操作系统的字符串,代表应用程序(可能是也可能不是绝对的或相对的)。
      • 同意。考虑到问题的内容 - 我试图简化 ;-)
      【解决方案4】:

      答案包含在argc 中。 NumOfParamaeters = argc-1;

      【讨论】:

        猜你喜欢
        • 2021-01-26
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        相关资源
        最近更新 更多