Из вашего замечания
Сначала мне нужно понять sscanf
, чтобы помочь вам прочитать, вот несколько предложений, из-за любого запоминания в ваших структурах
Первое предложение без проверки номеров на разделенных строках:
#include <stdio.h>
int main()
{
int nVertices, verticesRank;
if ((scanf("%d", &nVertices) != 1) ||
(nVertices < 0)) {
fputs("wrong number of vertices\n", stderr);
return -1;
}
for (verticesRank = 0; verticesRank < nVertices; verticesRank += 1) {
int nGroups, groupRank, vertex;
if ((scanf("%d", &nGroups) != 1) ||
(nGroups < 0)) {
fprintf(stderr, "wrong number of groups in vertices #%d\n", verticesRank);
return -1;
}
for (groupRank = 0; groupRank < nGroups; groupRank += 1) {
int a, b;
if ((scanf("%d%d", &a, &b) != 2) ||
(a < 1) || (b < 1)) {
fprintf(stderr, "wrong vertex IDs group #%d vertices #%d\n",
groupRank, verticesRank);
return -1;
}
if (groupRank == 0) {
vertex = a;
printf("vertex %d connecting", a);
}
else if (a != vertex) {
fprintf(stderr, "wrong vertex ID group #%d vertices #%d, %d rather than %d\n",
groupRank, verticesRank, a, vertex);
return -1;
}
printf(" %d", b);
}
putchar('\n');
}
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ cat > v
5
3
1 3
1 4
1 5
3
2 3
2 4
2 5
2
3 1
3 2
3
4 1
4 2
4 5
3
5 1
5 2
5 4
pi@raspberrypi:/tmp $ ./a.out <v
vertex 1 connecting 3 4 5
vertex 2 connecting 3 4 5
vertex 3 connecting 1 2
vertex 4 connecting 1 2 5
vertex 5 connecting 1 2 4
pi@raspberrypi:/tmp $
Вторая версия проверяет наличие правильного количества значений на строку:
#include <stdio.h>
int main()
{
char line[64];
int nVertices, verticesRank;
int dummy;
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d%d", &nVertices, &dummy) != 1) ||
(nVertices < 0)) {
fputs("wrong number of vertices\n", stderr);
return -1;
}
for (verticesRank = 0; verticesRank < nVertices; verticesRank += 1) {
int nGroups, groupRank, vertex;
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d%d", &nGroups, &dummy) != 1) ||
(nGroups < 0)) {
fprintf(stderr, "wrong number of groups in vertices #%d\n", verticesRank);
return -1;
}
for (groupRank = 0; groupRank < nGroups; groupRank += 1) {
int a, b;
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d%d%d", &a, &b, &dummy) != 2) ||
(a < 1) || (b < 1)) {
fprintf(stderr, "wrong vertex IDs group #%d vertices #%d\n",
groupRank, verticesRank);
return -1;
}
if (groupRank == 0) {
vertex = a;
printf("vertex %d connecting", a);
}
else if (a != vertex) {
fprintf(stderr, "wrong vertex ID group #%d vertices #%d, %d rather than %d\n",
groupRank, verticesRank, a, vertex);
return -1;
}
printf(" %d", b);
}
putchar('\n');
}
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -Wall cc.c
pi@raspberrypi:/tmp $ ./a.out <v
vertex 1 connecting 3 4 5
vertex 2 connecting 3 4 5
vertex 3 connecting 1 2
vertex 4 connecting 1 2 5
vertex 5 connecting 1 2 4
pi@raspberrypi:/tmp $
примечание Я не проверяю, есть ли что-то еще, кроме числа, поэтому первая строка считается правильной, это 5aze
например, если вам нужно проверить:
#include <stdio.h>
int main()
{
char line[64];
int nVertices, verticesRank;
char dummy;
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d%c", &nVertices, &dummy) != 2) ||
(nVertices < 0) ||
(dummy != '\n')) {
fputs("wrong number of vertices\n", stderr);
return -1;
}
for (verticesRank = 0; verticesRank < nVertices; verticesRank += 1) {
int nGroups, groupRank, vertex;
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d%c", &nGroups, &dummy) != 2) ||
(nGroups < 0) ||
(dummy != '\n')) {
fprintf(stderr, "wrong number of groups in vertices #%d\n", verticesRank);
return -1;
}
for (groupRank = 0; groupRank < nGroups; groupRank += 1) {
int a, b;
if ((fgets(line, sizeof(line), stdin) == NULL) ||
(sscanf(line, "%d%d%c", &a, &b, &dummy) != 3) ||
(a < 1) || (b < 1) ||
(dummy != '\n')) {
fprintf(stderr, "wrong vertex IDs group #%d vertices #%d\n",
groupRank, verticesRank);
return -1;
}
if (groupRank == 0) {
vertex = a;
printf("vertex %d connecting", a);
}
else if (a != vertex) {
fprintf(stderr, "wrong vertex ID group #%d vertices #%d, %d rather than %d\n",
groupRank, verticesRank, a, vertex);
return -1;
}
printf(" %d", b);
}
putchar('\n');
}
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -Wall cc.c
pi@raspberrypi:/tmp $ ./a.out <v
vertex 1 connecting 3 4 5
vertex 2 connecting 3 4 5
vertex 3 connecting 1 2
vertex 4 connecting 1 2 5
vertex 5 connecting 1 2 4
pi@raspberrypi:/tmp $
Обратите внимание, что даже дополнительный пробел (вне новой строки) после последнего ожидаемого числа считается ошибка в этом случае, и последняя строка также должна заканчиваться новой строкой.
Это не проверяет, есть ли что-то после теоретического конца, вы можете сделать несколько способов.
Также в ваш пример идентификатор вершины, являющийся первым номером в каждой паре, представляет собой последовательные числа 1, 2 ... в предложениях, прежде чем я не проверяю, что даже это легко проверить vertex == verticesRank+1
. Если это правило, зачем давать пару значений даром, когда достаточно только второго числа?