【问题标题】:How to find the length of argv[] in C如何在C中找到argv []的长度
【发布时间】:2013-09-10 01:38:18
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){
    int fir; //badly named loop variable
    char *input[] = calloc( strlen(argv), sizeof(char)); //initializing an array
    for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
        strcat(input, argv[fir]); // appending to input
    }
}

我得到的错误是第 7 行。它说“从不兼容的指针类型传递 'strlen' 的参数 1”。 strcat 函数出现同样的错误。 它还说“给定char **,但期望const char *”用于这两个功能。

我正在尝试用argv 的所有元素填充一个新数组,但第一个元素除外。我试过argv = &amp;argv[1],但没用。

strlen()strcat() 函数不采用 char 数组吗?

【问题讨论】:

  • 我想你想要一个索引到那个argv[],但是当你这样做的时候不要离开[0..(argc-1]

标签: c argv strlen strcat


【解决方案1】:

argvchar* 的数组。这个数组的大小是argc。您应该将此数组的一个元素传递给strlen

【讨论】:

    【解决方案2】:
    int main(int argc, char *argv[])
    

    argv 是指向char 的指针数组(即字符串数组)。该数组的长度存储在argc 参数中。

    strlen 用于检索必须以 null 结尾的单个字符串的长度,否则行为未定义。

    【讨论】:

    • 我想我明白了。我不能使用 argv[] 因为它实际上不是一个 char 数组,一个指向 char 的指针数组?如果我复制 argv[x] 并在 strcat 中使用它,比如 strcat(input, copyargv[x]) 会起作用吗?
    • argv[ ] 是字符串数组(即指向 char 指针的指针数组,其中每个 char 指针指向字符串的开头); argc 告诉你有多少个字符串; strlen返回传入字符串的长度,所以只能在char *上调用,即char[],即string):strlen(argv[i]),其中i在0到argc之间。
    【解决方案3】:

    也许你打算这样做:

    size_t argv_length(char** argv)
    {
        size_t ret = 0;
        while( *(++argv) )
            ret += strlen(*argv);
    
        return ret;
    }
    

    ?

    【讨论】:

      【解决方案4】:

      argv 需要一个 char* 数组,但您需要将 argc 传递给 strlen 而不是整个数组。 然后你不会在 strcat 上得到任何错误。

       #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      int main(int argc, char *argv[]){
      int fir; //badly named loop variable
      char *input[] = calloc( strlen(argc), sizeof(char)); //initializing an array
      for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
       strcat(input, argv[fir]); // appending to input
      }
      

      【讨论】:

        【解决方案5】:

        不知道为什么没有人建议更改 strlen 以引用指向 char 的指针数组中的特定条目?

         strlen(argv[0])     // also, 1, 2, up to (argc - 1)
        

        另外,http://www.cdecl.org/ 有助于确认 char *argv[] 语句是:declare argv as array of pointer to char

        【讨论】:

          【解决方案6】:

          argv 是一个字符数组,strlen 只接受字符串。如果你想获得argv 中每个参数的长度(这是我试图做的),你必须遍历它,访问像argv[i][j] 这样的元素。使用参数argv[i][j] != '\0'。如果您只想要参数的数量,请使用argc

          【讨论】:

            【解决方案7】:
            int count = 0; 
            while(argv[++count] != NULL);
            

            现在,count 的长度为 argv

            【讨论】:

            • != NULL 不是必需的。你可以做类似while(argv[++count]);
            • 这不只给你argc吗?您正在计算参数的数量,而不是用户运行的字符串的总长度。
            【解决方案8】:
            //Task = get length of argv
                string text=*argv; //assigning charValue to string variable "text"
                int l=text.length(); //getting the length of the string & assigning to variale "l"
            
                //this loop just outputs result on the screen
                for (int i=0; i<l; i++) { 
                    cout << *(*argv+i) << flush;
                }
            

            【讨论】:

            • 如果你能添加一些关于你的建议的描述,你的答案会得到很大的改善。
            • 对不起。最初的任务是将一个数组复制/附加到另一个数组中。为此,您需要数组长度。 sizeof(argv) / sizeof(char) 将不起作用。所以对我来说,获取长度的最简单方法是 1)将 argv 转换为字符串 2)使用“length()”识别该字符串的长度。 @EcologyTom
            • 好东西,考虑编辑您的答案,以便所有信息都包含在答案中,未来的读者不必阅读所有 cmets 即可找到所有详细信息。欢迎来到 SO!
            • 问题标记为 C,而不是 C++。
            猜你喜欢
            • 2010-09-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-04
            • 2021-04-11
            • 2014-05-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多