Info 2, Ötödik heti előadás: mutatók folytatása, ki- és bemenet

Utolsó módosítás: 2009. március 12.

Írjunk egy programot, ami minden sor elé szarkalábat szeretne rakni.

Bemenet.

A radványi sötét erdőben
   Halva találták Bárczi Benőt.
Hosszu hegyes tőr ifju szivében;
   "Ime, bizonyság Isten előtt:
   Gyilkos erőszak ölte meg őt!"

Kimenet.

> A radványi sötét erdőben
>    Halva találták Bárczi Benőt.
> Hosszu hegyes tőr ifju szivében;
>    "Ime, bizonyság Isten előtt:
>    Gyilkos erőszak ölte meg őt!"

Írjuk meg a programot. Itt eltároljuk a sort egy tömbbe, ami teljesen fölösleges, mivel karakterenként is megcsinálhatnánk ugyanezt, de persze ha a soron bonyolultabb transzformációt akarnánk végezni, akkor erre már szükség lenne.

#include <stdio.h>
#define MAXLEN 1000
int
getline(char *out, int max) {
        int i = 0, c, stop = 0;
        while (!stop && i < max) {
                c = getchar();
                if (EOF == c)
                        stop = 1;
                else {
                        out[i++] = c;
                        if ('\n' == c)
                                stop = 1;
                }
        }
        return i;
}
void
putstring(char *in, int size) {
        int i;
        for (i = 0; i < size; i++)
                putchar(in[i]);
}
#define PREFIX_LEN 2
char
prefix[] = { '>', ' ' };
int 
main(int argc, char **argv) {
        int len;
        char line[MAXLEN];
        while (0 < (len = getline(line, MAXLEN))) {
                putstring(prefix, PREFIX_LEN);
                putstring(line, len);
        }
        return 0;
}

Másik lehetőség: mutatók összehasonlításával.

#include <stdio.h>
#define MAXLEN 1000
char *
getline(char *out, char *end) {
        int c, stop = 0;
        while (!stop && out < end) {
                c = getchar();
                if (EOF == c)
                        stop = 1;
                else {
                        *out++ = c;
                        if ('\n' == c)
                                stop = 1;
                }
        }
        return out;
}
void
putstring(char *in, char *end) {
        while (in < end)
                putchar(*in++);
}
#define PREFIX_LEN 2
char
prefix[] = { '>', ' ' };
int 
main(int argc, char **argv) {
        char line[MAXLEN];
        char *end;
        while (line < (end = getline(line, line + MAXLEN))) {
                putstring(prefix, prefix + 2);
                putstring(line, end);
        }
        return 0;
}

Nulla karakterrel, mint lezáró elem.

#include <stdio.h>
#define MAXLEN 1000
int
getline(char *out, int len) {
        int i = 0, c, stop = 0;
        while (!stop && i < len - 1) {
                c = getchar();
                if (EOF == c)
                        return 0;
                else {
                        out[i++] = c;
                        if ('\n' == c)
                                stop = 1;
                }
        }
        out[i++] = 0;
        return 1;
}
void
putstring(char *in) {
        while (*in)
                putchar(*in++);
}
char
prefix[] = { '>', ' ', 0 };
int 
main(int argc, char **argv) {
        char line[MAXLEN];
        while (getline(line, MAXLEN)) {
                putstring(prefix);
                putstring(line);
        }
        return 0;
}

Megjegyzés: a helyett, hogy

char prefix[] = { '>', ' ', 0 };
írhatnánk azt is, hogy
char prefix[] = "> ";
a kettő teljesen ugyanazt jelenti.

Könyvtári függvényeket használó változat.

#include <stdio.h>
#define MAXLEN 1000
int
main(int argc, char **argv) {
        char line[MAXLEN];
        while (fgets(line, MAXLEN, stdin)) {
                fputs("> ", stdout);
                fputs(line, stdout);
        }
        return 0;
}