// Uppgift: Skriv ut alla kommandoradsargument utan och med hjälp av en vector // Nyckelord: std::vector, kommandoradsargument, iteratorer, indexering, pekarstegring, strlen // (Varför göra på ett sätt när det går göra på fyra? Nja, Lär er EN medtod!) #include #include using namespace std; // argc: Antalet ord på kommandoraden (INKLUSIVE programmets namn!) // argv: En inbyggd C-array som lagrar adressen till första teckenet i // varje ord. int main(int argc, char* argv[]) { // Skriv ut med inbyggd array och iterator (pekarstegring) // "auto" kommer väljas till "char*" av C++11 kompilatorn for (auto i = argv; i < (argv+argc); ++i) { cout << *i << endl; } // ATT FÖREDRA: Skriv ut med inbyggd array och indexering for (int i = 0; i < argc; ++i) { cout << argv[i] << endl; // * se nedan } // LITE ONÖDIGT, men ibland kanske praktiskt. Att betrakta som en // säker (säkrare) metod. Konvertera till vecor med C++-strängar vector arg(argv, argv+argc); // Inbyggd array och C-strängar ger INTE djupa kopior, jämför: // char* inte_kopia = argv[0]; // blir INTE en kopia av programnamnet // string kopia = arg[0]; // blir en kopia av programnamnet // Skriv ut med vector och iterator. "auto" kommer väljas till // "vector::const_iterator" av C++11 kompilatorn for (auto i = arg.cbegin(); i < arg.cend(); ++i) { cout << *i << endl; } // Skriv ut med vector och indexering for (unsigned i = 0; i < arg.size(); ++i) { cout << arg[i] << endl; // ** se nedan } // Varför göra på fyra sätt när det går att göra på FLER? // Vad händer om vector byts ut mot std::list eller std::set? return 0; } #if 0 // gör att preprocessorn tar bort detta // cout av ett kommandoradsargument går naturligtvis skriva ut ett // tecken i taget. Byt markerade cout-rader mot dessa lopar istället! // * här är nedan! for (int j = 0; j < strlen(argv[i]); ++j) { cout << argv[i][j] << endl; } cout << endl; // ** här är nedan igen! for (unsigned j = 0; j < arg[i].size(); ++j) { cout << argv[i][j] << endl; } cout << endl; #endif