繁体   English   中英

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

[英](C++) Very Basic Questions Regarding Syntax

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

  1. 如何将char *argv[]读取(或向人类说出)?
  2. 是否可以清除/擦除此类阵列中的特定内容(字符),字符? 如果有,怎么样?
  3. 数组可以调整大小吗? 如果有,怎么样?
  4. 如何将argv[]的整个内容复制到单个std::string变量中?
  5. 是否有其他方法可以确定没有argc argv[]单词 / 参数数量? 如果有,怎么样? (*)

我很感激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的指针数组。

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

  3. 只能复制到新数组。

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

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

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 :)

  1. 几个选项:指向char的指针数组或C-string的数组。

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

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

  4. 您将不得不迭代每个项目并将它们附加到字符串。 这可以通过C ++算法实现,例如与ostringstream上使用的ostream_iterator一起copy

  5. 否。如果这样的方式,不会有任何需要argc 编辑:显然对于argv 只有数组的最后一个元素是一个空指针。

  1. char *argv[]可以读作:“char的指针数组”

    char **argv可以读作:“指向char的指针”

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

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

  4. 你想如何将所有参数字符串表示为1 std :: string? 将它复制到std :: strings数组会更有意义

  5. 不,没有特殊指示数组中的最后一个条目。 你需要使用argc

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

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

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

回答你的问题:

  1. char *argv[]可以读作' char指针数组'
  2. 这是可能的,但涉及对内存中的数据进行直接操作,例如复制和/或移动字节。
  3. 不。但您可以分配新阵列和复制必要数据
  4. 通过手动将每个元素复制到std::string对象中
  5. 没有。

总结一下:您认为C ++是更低级的语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM