#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { NLOTTERY = 6 }; // number of lottery numbers
// read line from `stream`
// fail if input line is too long (larger than maxsize)
// return < 0 on error
// return 0 on success
static int readline(FILE* stream, char *line, size_t maxsize) {
char *s = NULL;
if ((s
= fgets(line
, maxsize
, stream
)) == NULL
|| strlen(s
) == (maxsize
-1)) // can't read from stream or line is too long
return -1;
return 0;
}
int main() {
FILE* fp = stdin; // read from stdin
// read number of records
char line[BUFSIZ];
if (readline(fp, line, sizeof(line)) < 0) {
}
int n = -1;
n
= atoi(line
); //note: ignore errors
// process records
int i = 0;
for ( ; i < n; ++i) {
// read first, last name
if (readline(fp, line, sizeof(line)) < 0) {
perror("readline: first, last name"); }
char firstname[sizeof(line)], lastname[sizeof(line)];
if (sscanf(line
, "%s %s", firstname
, lastname
) != 2) { // there must be exactly two words in the line
perror("sscanf: firstname, lastname"); }
// lottery numbers
if (readline(fp, line, sizeof(line)) < 0) {
perror("readline: lottery numbers"); }
char* token = NULL, *saveptr = NULL;
char* str = line;
int numbers[NLOTTERY];
size_t j = 0;
for ( ; j < sizeof(numbers)/sizeof(*numbers); ++j, str=NULL) {
if ((token = strtok_r(str, " ", &saveptr)) == NULL)
break;
numbers
[j
] = atoi(token
); //NOTE: ignore errors, else use strtol() if (numbers[j] < 0 || numbers[j] > 53) {
fprintf(stderr
, "error: number is not in range %d\n", numbers
[j
]); }
}
if (j != sizeof(numbers)/sizeof(*numbers)) {
// there must be exactly NLOTTERY numbers in the line
fprintf(stderr
, "error: %s\n", "strtok_r"); }
//
printf("first name: %s\tlast name: %s\t numbers: ", firstname
, lastname
); for (j = 0; j < sizeof(numbers)/sizeof(*numbers); ++j)
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKZW51bSB7IE5MT1RURVJZID0gNiB9OyAvLyBudW1iZXIgb2YgbG90dGVyeSBudW1iZXJzCgovLyByZWFkIGxpbmUgZnJvbSBgc3RyZWFtYAovLyBmYWlsIGlmIGlucHV0IGxpbmUgaXMgdG9vIGxvbmcgKGxhcmdlciB0aGFuIG1heHNpemUpCi8vIHJldHVybiA8IDAgb24gZXJyb3IKLy8gcmV0dXJuIDAgb24gc3VjY2VzcwpzdGF0aWMgaW50IHJlYWRsaW5lKEZJTEUqIHN0cmVhbSwgY2hhciAqbGluZSwgc2l6ZV90IG1heHNpemUpIHsKICBjaGFyICpzID0gTlVMTDsKICBpZiAoKHMgPSBmZ2V0cyhsaW5lLCBtYXhzaXplLCBzdHJlYW0pKSA9PSBOVUxMIHx8IHN0cmxlbihzKSA9PSAobWF4c2l6ZS0xKSkKICAgIC8vIGNhbid0IHJlYWQgZnJvbSBzdHJlYW0gb3IgbGluZSBpcyB0b28gbG9uZwogICAgcmV0dXJuIC0xOwogIHJldHVybiAwOwp9CgppbnQgbWFpbigpIHsKICBGSUxFKiBmcCA9IHN0ZGluOyAvLyByZWFkIGZyb20gc3RkaW4KCiAgLy8gcmVhZCBudW1iZXIgb2YgcmVjb3JkcwogIGNoYXIgbGluZVtCVUZTSVpdOwogIGlmIChyZWFkbGluZShmcCwgbGluZSwgc2l6ZW9mKGxpbmUpKSA8IDApIHsKICAgIHBlcnJvcigicmVhZGxpbmU6IG4iKTsKICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICB9CiAgaW50IG4gPSAtMTsKICBuID0gYXRvaShsaW5lKTsgLy9ub3RlOiBpZ25vcmUgZXJyb3JzCgogIC8vIHByb2Nlc3MgcmVjb3JkcwogIGludCBpID0gMDsKICBmb3IgKCA7IGkgPCBuOyArK2kpIHsKICAgIC8vIHJlYWQgZmlyc3QsIGxhc3QgbmFtZQogICAgaWYgKHJlYWRsaW5lKGZwLCBsaW5lLCBzaXplb2YobGluZSkpIDwgMCkgewogICAgICBwZXJyb3IoInJlYWRsaW5lOiBmaXJzdCwgbGFzdCBuYW1lIik7CiAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgIH0KICAgIGNoYXIgZmlyc3RuYW1lW3NpemVvZihsaW5lKV0sIGxhc3RuYW1lW3NpemVvZihsaW5lKV07CiAgICBpZiAoc3NjYW5mKGxpbmUsICIlcyAlcyIsIGZpcnN0bmFtZSwgbGFzdG5hbWUpICE9IDIpIHsKICAgICAgLy8gdGhlcmUgbXVzdCBiZSBleGFjdGx5IHR3byB3b3JkcyBpbiB0aGUgbGluZQogICAgICBwZXJyb3IoInNzY2FuZjogZmlyc3RuYW1lLCBsYXN0bmFtZSIpOwogICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgICB9CgogICAgLy8gbG90dGVyeSBudW1iZXJzCiAgICBpZiAocmVhZGxpbmUoZnAsIGxpbmUsIHNpemVvZihsaW5lKSkgPCAwKSB7CiAgICAgIHBlcnJvcigicmVhZGxpbmU6IGxvdHRlcnkgbnVtYmVycyIpOwogICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgICB9CiAgICBjaGFyKiB0b2tlbiA9IE5VTEwsICpzYXZlcHRyID0gTlVMTDsKICAgIGNoYXIqIHN0ciA9IGxpbmU7CiAgICBpbnQgbnVtYmVyc1tOTE9UVEVSWV07CiAgICBzaXplX3QgaiA9IDA7CiAgICBmb3IgKCA7IGogPCBzaXplb2YobnVtYmVycykvc2l6ZW9mKCpudW1iZXJzKTsgKytqLCBzdHI9TlVMTCkgewogICAgICBpZiAoKHRva2VuID0gc3RydG9rX3Ioc3RyLCAiICIsICZzYXZlcHRyKSkgPT0gTlVMTCkKCWJyZWFrOwogICAgICBudW1iZXJzW2pdID0gYXRvaSh0b2tlbik7IC8vTk9URTogaWdub3JlIGVycm9ycywgZWxzZSB1c2Ugc3RydG9sKCkKICAgICAgaWYgKG51bWJlcnNbal0gPCAwIHx8IG51bWJlcnNbal0gPiA1MykgewoJZnByaW50ZihzdGRlcnIsICJlcnJvcjogbnVtYmVyIGlzIG5vdCBpbiByYW5nZSAlZFxuIiwgbnVtYmVyc1tqXSk7CglleGl0KEVYSVRfRkFJTFVSRSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChqICE9IHNpemVvZihudW1iZXJzKS9zaXplb2YoKm51bWJlcnMpKSB7CiAgICAgIC8vIHRoZXJlIG11c3QgYmUgZXhhY3RseSBOTE9UVEVSWSBudW1iZXJzIGluIHRoZSBsaW5lCiAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICVzXG4iLCAic3RydG9rX3IiKTsKICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwogICAgfQoKICAgIC8vCiAgICBwcmludGYoImZpcnN0IG5hbWU6ICVzXHRsYXN0IG5hbWU6ICVzXHQgbnVtYmVyczogIiwgZmlyc3RuYW1lLCBsYXN0bmFtZSk7CiAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKG51bWJlcnMpL3NpemVvZigqbnVtYmVycyk7ICsraikKICAgICAgcHJpbnRmKCIlZCAiLCBudW1iZXJzW2pdKTsKICAgIHB1dHMoIiIpOwogIH0KICBleGl0KEVYSVRfU1VDQ0VTUyk7Cn0K