(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 **argv
或char *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 **argv
或char *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]);
}
关于最后一点,由于标准要求argv
被NULL
指针终止,所以很容易。
int myargc = 0;
char** argv_copy = argv;
while(++argv_copy)
++myargc;
while(++argv_copy)
将首先增加数组的指针,让它指向下一个元素(例如,在第一次迭代之后,它将指向c-string#2( argv[1]
))。 之后,如果指针的计算结果为false(如果它为NULL
),那么循环刹车,你有myargc
。 :)
上一篇: (C++) Very Basic Questions Regarding Syntax
下一篇: Workflow strategies for mitigating merge conflicts from topic branches