[英](C++) Very Basic Questions Regarding Syntax
这里是C ++新手。 我有一些基本问题。 在int main( int argc, char *argv[] )
char *argv[]
读取(或向人类说出)? argv[]
的整个内容复制到单个std::string
变量中? 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 );
它是一个指向char的指针数组。
排序 - 您可以覆盖它们。
只能复制到新数组。
编写一个循环并将每个argv [i]附加到C ++字符串。
大多数实现使用NULL指针终止数组。 我不记得这是不是标准。
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
。 :)
几个选项:指向char的指针数组或C-string的数组。
您可以指定特定字符以清除它们,也可以将数组的其余部分向前移动到“擦除”字符/元素。
普通的C风格数组无法调整大小。 如果你需要在C ++中使用可调整大小的数组,你应该使用std::vector
。
您将不得不迭代每个项目并将它们附加到字符串。 这可以通过C ++算法实现,例如与ostringstream
上使用的ostream_iterator
一起copy
。
否。如果有这样的方式,不会有任何需要argc
。 编辑:显然对于argv
只有数组的最后一个元素是一个空指针。
char *argv[]
可以读作:“char的指针数组”
char **argv
可以读作:“指向char的指针”
是的,您可以修改argv
数组。 例如, argv[0][0] = 'H'
将修改第一个参数的第一个字符。 如果通过“擦除/清除”你的意思是从数组中删除一个字符并且所有内容都自动切换:没有自动的方法 - 你需要将所有字符一个接一个地复制到左边(包括NULL终止)
不,数组无法调整大小。 您需要创建一个新的并复制内容
你想如何将所有参数字符串表示为1 std :: string? 将它复制到std :: strings数组会更有意义
不,没有特殊指示数组中的最后一个条目。 你需要使用argc
int argc, char **argv
或int argc, char *argv[]
- 这是等价的)。 std::list<std::string> args(&argv[1], &argv[argc]);
创建字符串std::list<std::string> args(&argv[1], &argv[argc]);
。 NULL
终止,但这不是保证。 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
C / C ++中的数组不是对象,而只是指向数组第一个元素的指针,因此您不能简单地删除或插入值。
回答你的问题:
char *argv[]
可以读作' char
指针数组' std::string
对象中 总结一下:您认为C ++是更低级的语言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.