Проблема, с которой вы столкнулись, заключается в том, что вы предполагаете, что sscanf
совершает какое-то волшебство, а именно то, что он запоминает, где он находился в buffer
после последнего вызова.такая магия, она будет обрабатываться в начале строки, которую вы ей дадите, независимо от того, сколько раз вы уже вызывали ее с этой же строкой.
Итак, вложенная
sscanf(buffer,"%d", &skater[i].score[k][j]);
всегда читает самый первый int
в buffer
, то есть 1
в вашем образце.Не происходит никакой «перезаписи», вы просто читаете одно и то же снова и снова.
Чтобы это работало, вам нужно отслеживать, где вы должны начать анализ самостоятельно.Это может быть сделано с помощью спецификатора формата %n
и «курсора» char *
в вашем буфере, например.
Вот пример того, как вы используете это:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char **argv)
{
int val;
int pos;
char *cur = argv[1];
printf("Input: [%s]\n", cur);
while (sscanf(cur, "%d%n", &val, &pos)==1) {
printf("Read %d, rest is [%s]\n", val, cur+pos);
cur += pos;
}
return 0;
}
Попробуйте запустить этот код с другими параметрами:
$ gcc -Wall t.c
$ ./a.out "1"
Input: [1]
Read 1, rest is []
$ ./a.out "1 2"
Input: [1 2]
Read 1, rest is [ 2]
Read 2, rest is []
$ ./a.out "1 a 2"
Input: [1 a 2]
Read 1, rest is [ a 2]
$ ./a.out "1 2 3 54"
Input: [1 2 3 54]
Read 1, rest is [ 2 3 54]
Read 2, rest is [ 3 54]
Read 3, rest is [ 54]
Read 54, rest is []
$ ./a.out "1.0 2 3 54"
Input: [1.0 2 3 54]
Read 1, rest is [.0 2 3 54]