Tuli kummallinen ongelma. Kun vaihdan "ensimmäisen" ja "toisen osan" (koodissa kommentoituina) paikkaa niin, että "toinen osa" on ensin, "ensimmäistä osaa" ei koskaan edes testata, vaikka "toisen osan" if-lauseeseen ei mennä, eli ehto ei toteudu. Ohjelma ei myöskään tulosta lopussa tulostettavaa tekstiä. Kun ensimmäinen osa on ensin, ohjelma toimii oikein.
int main(int argc, char **argv){ string line; vector<string> v; ifstream file; cout << argc << endl; if (argc < 2){ // Ensimmäinen osa cout << "No file specified" << endl; return 0; } if (strcmp(argv[1], "-h") == 0){ // Toinen osa cout << "Usage: main <filename>" << endl; return 0; } file.open(argv[1]); if (file.is_open()){ // Koodia else cout << "Unable to open file" << endl; }
Ohjelma kaatunee jos siirrät toisen osan ennen ensimmäistä, koska argv[1] sisältää null-osoittimen jos ohjelmalle ei ole annettu yhtään parametria ja strcmp vaatii että kumpikin parametri on kunnollinen merkkijono.
Kiitos vastauksesta. Miten sen voisi saada toimimaan niin, ettei se kaadu tuossa tapauksessa? Kummastelen vain, että miksei voi vaihdella koodiblokkien paikkoja niin, ettei ohjelma kaadu.
Ripe kirjoitti:
Kummastelen vain, että miksei voi vaihdella koodiblokkien paikkoja niin, ettei ohjelma kaadu.
Ihan samasta syystä kuin ei voi ensin myydä autoaan ja sitten lähteä ajamaan sillä. Jos parametria ei ole, sitä ei voi verrata tekstiin "-h".
En ymmärrä, miksi edes haluaisit vaihtaa noiden paikkaa. Vaikka koodi tuurilla toimisikin, toiminta olisi täsmälleen sama: jos parametri "-h" on annettu, parametrien määrän tarkistava ehto ei voi toteutua.
Tietenkin koodin järjestyksen muuttaminen (näennäisesti) on mahdollista, kunhan tarkistat ennen tekstin vertailua, että parametrien määrä on riittävä:
if (argc >= 2 && strcmp(argv[1], "-h") == 0) { /* ... */ } if (argc < 2) { /* ... */ }
Aihe on jo aika vanha, joten et voi enää vastata siihen.