[英](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.