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 );
答案 0 :(得分:2)
这是一个指向char的指针数组。
排序 - 您可以覆盖它们。
仅限复制到新阵列。
编写循环并将每个argv [i]附加到C ++字符串。
大多数实现使用NULL指针终止数组。我不记得这是不是标准。
答案 1 :(得分:1)
char **argv[]
错了。它应该是char **argv
或char *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]);
}
关于你的最后一点,由于标准要求argv
被NULL
指针终止,这很容易。
int myargc = 0;
char** argv_copy = argv;
while(++argv_copy)
++myargc;
while(++argv_copy)
将首先递增数组的指针,让它指向下一个元素(例如,在第一次迭代之后,它将指向c-string#2(argv[1]
))。之后,如果指针的计算结果为false(如果它是NULL
),那么循环就会制动并且你有myargc
。 :)
答案 2 :(得分:1)
几个选项:指向C字符串的char OR数组的指针数组。
您可以指定特定字符以清除它们,也可以将数组的其余部分向前移动到“擦除”字符/元素。
普通的C风格数组无法调整大小。如果您需要在C ++中使用可调整大小的数组,则应使用std::vector
。
您必须遍历每个项目并将它们附加到字符串中。这可以通过C ++算法完成,例如copy
和ostream_iterator
上使用的ostringstream
。
没有。如果是这样的话,则不需要argc
。编辑:显然只有argv
数组的最后一个元素是一个空指针。
答案 3 :(得分:0)
char *argv[]
可以理解为:“指向char的指针数组”
char **argv
可以理解为:“指向char的指针”
是的,您可以修改argv
数组。例如,argv[0][0] = 'H'
将修改第一个参数的第一个字符。如果通过“擦除/清除”你的意思是从数组中删除一个字符并且所有内容都自动切换:没有自动的方法 - 你需要将所有字符一个接一个地复制到左边(包括NULL终止)
不,数组无法调整大小。您需要创建一个新的并复制内容
您想如何将所有参数字符串表示为1 std :: string?将它复制到std :: strings
不,没有特殊指示数组中的最后一个条目。您需要使用argc
答案 4 :(得分:0)
int argc, char **argv
或int argc, char *argv[]
- 这是等价的)。 std::list<std::string> args(&argv[1], &argv[argc]);
创建字符串列表。NULL
,但这不是保证。答案 5 :(得分:0)
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,请参阅“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 ++中的数组不是对象,而只是指向数组第一个元素的指针,因此您不能简单地删除或插入值。
回答你的问题:
char *argv[]
可以理解为'char
'std::string
对象总结:您认为C ++是更低级的语言。