首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(C++)关于句法的基本问题

(C++)关于句法的基本问题
EN

Stack Overflow用户
提问于 2011-05-10 13:51:34
回答 7查看 442关注 0票数 7

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

  1. char *argv[]应该如何被读(或者对人类说出来)?
  2. 是否可以清除/删除此类数组中的特定内容、字符?如果是,怎么做?
  3. 数组可以调整大小吗?如果是,怎么做?
  4. 如何将argv[]的全部内容复制到单个std::string变量中?
  5. 在没有argv[]中,是否有其他方法来确定argv[]中的/参数的个数?如果是,怎么做?(*)

我希望你能解释一下数字2-5 (不是代码)。我会自己算出代码(这样我学得更快)。

提前谢谢。

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

代码语言:javascript
复制
for( int i = 0; i < argc; ++i ) {
    std::cout << argv[i] << std::endl;
}

代码语言:javascript
复制
int i = 0;    
while( i < argc ) {
    std::cout << argv[i] << std::endl;
    ++i;
}

代码语言:javascript
复制
int i = 0;
do { 
     std::cout << argv[i] << std::endl;
     ++i; } while( i < argc );
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-10 14:01:31

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

2) CString是用来操作C字符串(字符数组)的std库。如果不重新分配数组的大小,则无法调整数组的大小,但可以通过索引引用元素的内容:

代码语言:javascript
复制
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)技术上没有,但是可以删除它们,然后重新分配:

代码语言:javascript
复制
int *array = new int[15]; //array of size 15
delete[] array;
array = new int[50]; //array of size 50

4) --这是一种方法:

代码语言:javascript
复制
string *myString;
if(argc > 0)
{
   myString = new string(argv[0]);
   for(int i = 1; i < argc; ++i)
      myString->append(argv[i]);
}

5)是的,据库比说:

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

这意味着你可以:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2011-05-10 14:00:13

  1. 它是指向char的一系列指针。
  2. 有点-你可以重写它们。
  3. 仅通过复制到新数组。
  4. 编写一个循环并将每个argvi附加到一个C++字符串中。
  5. 大多数实现使用空指针终止数组。我不记得这是不是标准的了。
票数 2
EN

Stack Overflow用户

发布于 2011-05-10 14:03:53

代码语言:javascript
复制
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数组,每个数组都包含一个参数。

代码语言:javascript
复制
std::vector<std::string> args;
for(int i=0; i < argc; ++i){
  args.push_back(argv[i]);
}

在最后一点上,由于标准要求argvNULL指针结束,所以非常容易。

代码语言:javascript
复制
int myargc = 0;
char** argv_copy = argv;
while(++argv_copy)
  ++myargc;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5951133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档