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

时间:2011-05-10 13:51:34

标签: c++ arrays pointers syntax

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

  1. char *argv[]应该如何阅读(或向人类说出)?
  2. 是否可以清除/删除此类阵列中的特定内容(字符),字符?如果是,怎么样?
  3. 可以调整数组的大小吗?如果有,怎么样?
  4. 如何将argv[]的整个内容复制到单个std::string变量中?
  5. argv[]没有argc的情况下,还有其他方法可以确定 / 参数的数量吗?如果有,怎么样? (*)
  6. 我很感激数字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 );
    

7 个答案:

答案 0 :(得分:2)

  1. 这是一个指向char的指针数组。

  2. 排序 - 您可以覆盖它们。

  3. 仅限复制到新阵列。

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

  5. 大多数实现使用NULL指针终止数组。我不记得这是不是标准。

答案 1 :(得分:1)

char **argv[]

错了。它应该是char **argvchar *argv[],而不是两者的混合。然后它变成指向字符的指针,或者说是指向c字符串的指针,即c字符串数组。 :) cdecl.org在这样的事情上也很有帮助。
然后,对于访问,当然。只是,好吧,访问它。 :) argv[0]将是第一个字符串,argv[3]将是第4个字符串。但我完全不建议更换不属于你的阵列中的东西,或者你知道内部的东西。
在数组调整大小时,因为你正在编写C ++,所以使用std::vector,它可以为你完成所有复杂的分配工作并且非常安全。通常,它取决于数组类型。动态分配的数组(int* int_arr = new int[20])可以,静态数组(int int_arr[20])不能 要将argv中的所有内容复制到单个std::string中,请遍历数组并将每个c字符串附加到std::string。我不建议这样做,而是有一个std::vector<std::string>,即一个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。 :)

答案 2 :(得分:1)

  1. 几个选项:指向C字符串的char OR数组的指针数组。

  2. 您可以指定特定字符以清除它们,也可以将数组的其余部分向前移动到“擦除”字符/元素。

  3. 普通的C风格数组无法调整大小。如果您需要在C ++中使用可调整大小的数组,则应使用std::vector

  4. 您必须遍历每个项目并将它们附加到字符串中。这可以通过C ++算法完成,例如copyostream_iterator上使用的ostringstream

  5. 没有。如果这样的话,则不需要argc。编辑:显然只有argv 数组的最后一个元素是一个空指针。

答案 3 :(得分:0)

  1. char *argv[]可以理解为:“指向char的指针数组”

    char **argv可以理解为:“指向char的指针”

  2. 是的,您可以修改argv数组。例如,argv[0][0] = 'H'将修改第一个参数的第一个字符。如果通过“擦除/清除”你的意思是从数组中删除一个字符并且所有内容都自动切换:没有自动的方法 - 你需要将所有字符一个接一个地复制到左边(包括NULL终止)

  3. 不,数组无法调整大小。您需要创建一个新的并复制内容

  4. 您想如何将所有参数字符串表示为1 std :: string?将它复制到std :: strings

  5. 的数组会更有意义
  6. 不,没有特殊指示数组中的最后一个条目。您需要使用argc

答案 4 :(得分:0)

  1. 它被称为“指向字符指针的指针数组”(请注意,这不是主函数的签名,可以是int argc, char **argvint argc, char *argv[] - 这是等价的)。
  2. argv数组是可修改的(缺少const)。写入超出其中一个字符串的末尾或扩展数组是非法的;如果你需要扩展一个字符串,创建一个字符串并在数组中存储一个指针;如果需要扩展数组,请创建数组的副本。
  3. 它们本身无法调整大小,但重新解释为较小的数组(这解释了最后一个问题的答案)。
  4. 您将以这种方式丢失信息 - argv是一个数组数组,因为各个参数已经为您分开了。您可以使用std::list<std::string> args(&argv[1], &argv[argc]);创建字符串列表。
  5. 不是。大多数系统已终止argv NULL,但这不是保证。

答案 5 :(得分:0)

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,请参阅“The   申请应确保最后   此数组的成员为null   指针。“at   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

答案 6 :(得分:-1)

C / C ++中的数组不是对象,而只是指向数组第一个元素的指针,因此您不能简单地删除或插入值。

回答你的问题:

  1. char *argv[]可以理解为'char'
  2. 的指针数组
  3. 这是可能的,但涉及对内存中的数据进行直接操作,例如复制和/或移动字节。
  4. 否。但是你可以分配新的数组并复制必要的数据
  5. 通过手动将每个元素复制到std::string对象
  6. 没有
  7. 总结:您认为C ++是更低级的语言。