(C ++)关于语法的非常基本的问题

这里的C ++新手。 我有一些基本的问题。 在int main( int argc, char *argv[] )

  • char *argv[]应该如何读取(或向人类说出)?
  • 是否可以清除/擦除此类数组中的特定内容,字符? 如果是,如何?
  • 数组可以调整大小吗? 如果是,如何?
  • 如何将argv[]的全部内容复制到单个std::string变量中?
  • 有没有其他方法可以确定argv[]没有argc单词 / 参数的数量? 如果是,如何? (*)
  • 我会很感激数字2-5的解释(不是代码)。 我会自己弄清代码(我通过这种方式学得更快)。

    提前致谢。

    (*)我知道main(char *argv[])是非法的。 我的意思是至少有一种方法不涉及argc ,就像下面的表达式一样:

    for( int i = 0; i < argc; ++i ) {
        std::cout << argv[i] << std::endl;
    }
    

    int i = 0;    
    while( i < argc ) {
        std::cout << argv[i] << std::endl;
        ++i;
    }
    

    要么

    int i = 0;
    do { 
         std::cout << argv[i] << std::endl;
         ++i; } while( i < argc );
    

    1)它应该是char **argvchar *argv[] ,它是a pointer to an array of characters通常称为an array of strings

    2) CString是操纵C字符串(字符数组)的std库。 你不能在不重新分配数组的情况下重新调整数组大小,但可以通过索引引用它来更改元素的内容:

    for(int i = 0; i < argc; ++i)
    {
       //set all the strings to have a null character in the
       //first slot so all Cstring operations on this array, 
       //will consider it a null (empty) string
       argv[i] = 0;
    }
    


    3)技术上不行,但是可以删除然后重新分配:

    int *array = new int[15]; //array of size 15
    delete[] array;
    array = new int[50]; //array of size 50
    

    4)这是一种方式:

    string *myString;
    if(argc > 0)
    {
       myString = new string(argv[0]);
       for(int i = 1; i < argc; ++i)
          myString->append(argv[i]);
    }
    

    5)是的,根据Cubbi:

    POSIX为argv指定最终的空指针,例如参见“应用程序应确保该数组的最后一个成员是空指针。” 在pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html

    这意味着你可以这样做:

    char *val = NULL;
    int i = 0;
    do
    {
       val = argv[i++]; //access argv[i], store it in val, then increment i
       //do something with val
    } while(val != NULL); //loop until end of argv array
    

  • 这是一个char指针数组。

  • 排序 - 你可以覆盖它们。

  • 只有通过复制到一个新的数组。

  • 编写一个循环,并将每个argv [i]附加到C ++字符串。

  • 大多数实现用NULL指针终止数组。 我不记得这是否是标准的。


  • char **argv[]
    

    是错的。 它应该是char **argvchar *argv[] ,而不是两者的混合。 然后它变成一个指向字符的指针,或者说是一个指向c字符串的指针,即一个c字符串数组。 :) cdecl.org在这方面也很有帮助。
    那么,对于访问,当然。 就这样,访问它。 :) argv[0]将是第一个字符串, argv[3]将是第四个字符串。 但我完全不会推荐替换不属于你的数组或者你知道内部数组的东西。
    在数组调整大小时,因为您正在编写C ++,请使用std::vector ,它为您完成所有复杂的分配任务,并且非常安全。 一般来说,它取决于数组的类型。 动态分配的数组( int* int_arr = new int[20] )可以,静态数组( int int_arr[20] )不能。
    要将argv所有内容复制到单个std::string ,请循环访问数组,并将每个c-string附加到std::string 。 我不会推荐,但是,有一个std::vector<std::string> ,即std::strings数组,每个std::strings都包含一个参数。

    std::vector<std::string> args;
    for(int i=0; i < argc; ++i){
      args.push_back(argv[i]);
    }
    

    关于最后一点,由于标准要求argvNULL指针终止,所以很容易。

    int myargc = 0;
    char** argv_copy = argv;
    while(++argv_copy)
      ++myargc;
    

    while(++argv_copy)将首先增加数组的指针,让它指向下一个元素(例如,在第一次迭代之后,它将指向c-string#2( argv[1] ))。 之后,如果指针的计算结果为false(如果它为NULL ),那么循环刹车,你有myargc 。 :)

    链接地址: http://www.djcxy.com/p/6923.html

    上一篇: (C++) Very Basic Questions Regarding Syntax

    下一篇: Workflow strategies for mitigating merge conflicts from topic branches