Jeg har ikke lige en compiler ved hånden, men (hvis ikke jeg husker helt galt) det første argument er stien til programmet. Dvs at hvis du skal bruge 4 parametre, så skal du altså skrive if( argc!=5 ) ...
Når man programmerer og det ikke virker, så er det ofte en god idé at kontrollere værdien/indholdet af forskellige variabler.
Ovenstående kunne du f.eks. kontrollere ved 1) cout << argc; 2) for(int i=0; i<argc; i++) cout << argv[i] << endl;
Og så ville du formentlig opdage det jeg har skrevet ;-)
1) Dit check på antal parametre er galt - du kræver at argc skal være 4 - men da programmets eget navn altid er parameter 1, betyder det at dit program kun modtager 3 andre parametre. Hvis brugeren følger din vejledning med filenavn1, filnavn2, streng1, streng2 vil programmet aldrig starte op.
2) Din åbning af fil1 sletter indholdet af filen, fordi du skrive 'ios::out|ios::in' - det skal du rette til 'ios::in'.
3) Din sammenligning på (ord == argv[5]). I modsætning til hvad du sikkert tror, er det ikke INDHOLDET af ord du sammenligner med INDHOLDET af parameter 5, men derimod adressen på de to. (Det er char* variabler, dvs. adresser på et areal i hukommelsen. Se mit svar til bjarke omkring far/near pointere, hvis du vil vide mere om pointere.) Hvis dit program skal virke skal du inkludere <string.h> i toppen af dit program, og ændre IF'en til if (strcmp(ord, argv[2]) == 0). (Se nedenfor omkring argv[2].)
Derudover checker du i dit program ord mod argv[5] - men der er aldrig udfyldt. Indkser i C er 0-baserede, dvs. det færste element (element 1) i en tabel har indeks 0, 2. element indeks 2 osv. Hvis vi antager at man blot skal indtaste et fil-navn og et søge ord, skal du blot kræve at argc er 3 (programnavn + de to parametere), og i IF'en checke ord mod argv[2]. (Det tredie element i parameter tabellen.) Tilsvarende skal du så udskrive argv[2] i cout'en lige under IF'en.
:-) Jeg har lavet en ændret version af dit program, der virker nu. Skriv igen, hvis jeg skal lægge den ind her som svar.
P.S. Istedet for at bruge 'exit(1)', bør du ændre 'main' til 'int main' og skrive 'return 1' i stedet for 'exit(1)'. Det giver kortere kode. 'exit(1)' er kun beregnet til at lave "program halt" i underfunktioner langt "nede" i programmet. Altså i stil med:
hi hi :-) Det er jo min eneste chance! Når jeg ikke har så meget tid og kun laver korte svar, så må jeg jo satse på at spørger giver mig point inden du kommer :-)
Hvad laver du i grunden soepro? Det lader til, at du altid har tid til at skrive en hel roman? (Det er fedt nok når jeg selv spørger, men ikke når jeg skal konkurrere med dig - skulle vi ikke lave pointdeling?)
Iøvrigt vil dit program dumpe, hvis du finder et ord der er længere end 63 tegn (64-1). Du bør rette fil_1>>ord til fil1_.getline(ord, sizeof(ord), ' ') i stedet for. Så vil ord aldrig indlæse mere end 63 tegn.
int main(int argc, char *argv[]) { char linie[256]; char ord[64]; if(argc!= 3) { cout<<"du skal angive fil1, streng1 i komando linien"<<endl; return 1; } ifstream fil_1(argv[1],ios::in); if(! fil_1) { cout <<"kan ikke åbne filen "<<argv<<endl; return 1; } cout << "Leder efter "<<argv[2]<< " i "<<argv[1]<<endl;
while(! fil_1.eof()) { fil_1.getline(ord, sizeof(ord), ' '); if(strstr(ord, argv[2]) != NULL) { cout<<argv[1]<< " indeholder ordet "<<argv[2]<<endl; return 0; } } cout<<argv[2]<<" er IKKE fundet i "<<argv[1]<<endl; return 2; }
bjarke >> Ja, jeg har selv lavet DryCASH 2000 og jeg hedder Vagn.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.