/* --------------------------------------------------- */ /* --- Obracanie riadkov --- */ /* --------------------------------------------------- */ /* --------------------------------------------------- zapocet z C pre 3MI december 1996 --------------------------------------------------- Uloha c.1: ---------- - upravte program tak, aby v pripade ak mu boli z prikazoveho riadku zadane neuplne udaje, si dalsie informacie sam od uzivatela ziskal (problemovy pripad: bol zadany iba jeden subor) Uloha c.2: ---------- - upravte program tak, aby pri reverzii riadkov nepouzival rekurziu - co by ste zmenili aby program obracal len jednotlive slova vo vstupnom riadku --------------------------------------------------- */ #include #include #include /* --- maximalna dlzka vstupneho riadku --- */ #define MAX_LEN 1024 /* --- vrati "revertovany" retazec k retazcu 'str' --- */ char * reverse(char * str); /* --- pomocna funkcia --- */ char * reverse_buffer(char * in, char * out); int main(int argc, char * argv[]) { /* --- Deklaracia premmenych --- */ char buffer[MAX_LEN + 1]; FILE * input, * output; if (argc <= 1) { /* --- ak nemame dost zadanych argumentov budeme citat zo standardneho vstupu a pisat na standardny vystup --- */ input = stdin; output = stdout; } else if (argc <= 2) { /* a sucasne nie je <= 1*/ printf("Chcem bud dva argumenty: vstupny_subor vystupny_subor\n"); printf("alebo ziaden argument (potom citam zo stdin a pisem na stdout)\n"); return 0; } else { /* --- otvor subor zadany z prikazoveho riadku na citanie --- */ argc--; argv++; input = fopen(argv[0], "r"); if (!input) { printf("Nemozem nasjst, alebo otvorit vstupny subor !\n"); return -1; } output = fopen(argv[1], "w"); if (!output) { printf("Nemozem nasjst, alebo otvorit vystupny subor !\n"); return -1; } } for (;;) { /* --- nacitaj dalsi riadok do buffra --- */ fgets(buffer, sizeof(buffer) -1, input); /* --- kontrola --- */ if (ferror(input)) { printf("Chyba pri citani zo suboru !\n"); if (input != stdin) fclose(input); return -1; } /* --- treba otestovat koniec vstupu --- */ if (feof(input)) break; /* --- odstranit koncovy 'EOL' --- */ buffer[strlen(buffer) -1] = 0; /* --- vystup --- */ fprintf(output, "%s\n", reverse(buffer)); } /* --- ak bol vstup citany zo suboru treba ho zavriet --- */ if (input != stdin) fclose(input); /* --- treba vratit vysledok cinnosti programu --- */ return 0; } /* --- pomocna funkcia --- */ char * reverse_buffer(char * in, char * out) { if (*in) { *out = *in; out --; in ++; return reverse_buffer(in, out); } else return out +1; } /* --- vrati "revertovany" retazec k retazcu 'str' --- */ char * reverse(char * str) { char buffer[MAX_LEN +1]; int len = strlen(str); memset(buffer, 0, sizeof(buffer)); return reverse_buffer(str, &buffer[len -1]); }