簡體   English   中英

(C ++)關於語法的非常基本的問題

[英](C++) Very Basic Questions Regarding Syntax

這里是C ++新手。 我有一些基本問題。 int main( int argc, char *argv[] )

  1. 如何將char *argv[]讀取(或向人類說出)?
  2. 是否可以清除/擦除此類陣列中的特定內容(字符),字符? 如果有,怎么樣?
  3. 數組可以調整大小嗎? 如果有,怎么樣?
  4. 如何將argv[]的整個內容復制到單個std::string變量中?
  5. 是否有其他方法可以確定沒有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 );
  1. 它是一個指向char的指針數組。

  2. 排序 - 您可以覆蓋它們。

  3. 只能復制到新數組。

  4. 編寫一個循環並將每個argv [i]附加到C ++字符串。

  5. 大多數實現使用NULL指針終止數組。 我不記得這是不是標准。

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數組,每個都持有一個參數。

std::vector<std::string> args;
for(int i=0; i < argc; ++i){
  args.push_back(argv[i]);
}

在你的最后一點,由於標准要求argvNULL指針終止,所以很容易。

int myargc = 0;
char** argv_copy = argv;
while(++argv_copy)
  ++myargc;

while(++argv_copy)將首先遞增數組的指針,讓它指向下一個元素(例如,在第一次迭代之后它將指向c-string#2( argv[1] ))。 之后,如果指針的計算結果為false(如果它為NULL ),則循環制動並且你有你的myargc :)

  1. 幾個選項:指向char的指針數組或C-string的數組。

  2. 您可以指定特定字符以清除它們,也可以將數組的其余部分向前移動到“擦除”字符/元素。

  3. 普通的C風格數組無法調整大小。 如果你需要在C ++中使用可調整大小的數組,你應該使用std::vector

  4. 您將不得不迭代每個項目並將它們附加到字符串。 這可以通過C ++算法實現,例如與ostringstream上使用的ostream_iterator一起copy

  5. 否。如果這樣的方式,不會有任何需要argc 編輯:顯然對於argv 只有數組的最后一個元素是一個空指針。

  1. char *argv[]可以讀作:“char的指針數組”

    char **argv可以讀作:“指向char的指針”

  2. 是的,您可以修改argv數組。 例如, argv[0][0] = 'H'將修改第一個參數的第一個字符。 如果通過“擦除/清除”你的意思是從數組中刪除一個字符並且所有內容都自動切換:沒有自動的方法 - 你需要將所有字符一個接一個地復制到左邊(包括NULL終止)

  3. 不,數組無法調整大小。 您需要創建一個新的並復制內容

  4. 你想如何將所有參數字符串表示為1 std :: string? 將它復制到std :: strings數組會更有意義

  5. 不,沒有特殊指示數組中的最后一個條目。 你需要使用argc

  1. 它被稱為“指向字符指針的指針數組”(請注意,這不是主函數的簽名,它是int argc, char **argvint argc, char *argv[] - 這是等價的)。
  2. argv數組是可修改的(缺少const)。 寫入超出其中一個字符串的末尾或擴展數組是非法的; 如果你需要擴展一個字符串,創建一個字符串並在數組中存儲一個指針; 如果需要擴展數組,請創建數組的副本。
  3. 它們本身無法調整大小,但重新解釋為較小的數組(這解釋了最后一個問題的答案)。
  4. 你將以這種方式丟失信息 - argv是一個數組數組,因為各個參數已經為你分開了。 您可以使用std::list<std::string> args(&argv[1], &argv[argc]);創建字符串std::list<std::string> args(&argv[1], &argv[argc]);
  5. 並不是的。 大多數系統都有argv NULL終止,但這不是保證。

1)它應該是char **argvchar *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 ++中的數組不是對象,而只是指向數組第一個元素的指針,因此您不能簡單地刪除或插入值。

回答你的問題:

  1. char *argv[]可以讀作' char指針數組'
  2. 這是可能的,但涉及對內存中的數據進行直接操作,例如復制和/或移動字節。
  3. 不。但您可以分配新陣列和復制必要數據
  4. 通過手動將每個元素復制到std::string對象中
  5. 沒有。

總結一下:您認為C ++是更低級的語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM