Это потому что это
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) != EOF)
{
}
никогда не будет true
Я думаю, поскольку scanf()
возвращает количество успешно отсканированных параметров, я бы сделал это вместо этого
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) == 2)
{
}
Ваш код не работает, потому что он не удовлетворяет условию sscanf()
для возврата EOF
, следующее взято со страницы руководства, на которую ссылается в конце
Значение EOF
возвращается, если конец ввода достигнут до первого успешного преобразования или ошибки сопоставления. EOF
также возвращается, если возникает ошибка чтения, и в этом случае устанавливается индикатор ошибки для потока (см. ferror(3)
), а errno устанавливается для индикации ошибки.
Таким образом, кажется, что вы не достигаете конца, если вводите до первого успешного преобразования или ошибки сопоставления, что имеет смысл в соответствии с содержимым файла. И вторая часть относится только к файловым потокам, конечно.
И вместо sscanf(temp3, ",")
, который не делает то, что вы думаете, вы могли бы сделать это так
next = strchr(temp3, ',');
if (next != NULL)
temp3 = next + 1;
else
/* you've reached the end here */
Это предложение о том, как разобрать этот файл
#include <stdio.h>
#include <string.h>
int
main(void)
{
const char temp3[] = "(1,6),(2,6),(2,9),(1,9)\n(1,5)";
char *source;
int x, y;
int count;
source = temp3;
while (sscanf(source, "(%d,%d)%*[^(]%n", &x, &y, &count) == 2)
{
/* this is just for code clarity */
polygonx[polycount][vertcount] = x;
polygony[polycount][vertcount] = y;
/* Process here if needed, and then advance the pointer */
source += count;
}
return 0;
}
Спецификатор "%n"
фиксирует количество просканированных на данный момент символов, поэтому его можно использовать для перемещения указателя на позицию las, просканированную в исходной строке.
И "%*[^("
будет пропускать все символы, пока не будет найден следующий '('
.
Пожалуйста, обратитесь к sscanf(3)
для получения дополнительной информации о спецификаторе "%n"
и спецификатор %[
.
person
Iharob Al Asimi
schedule
24.09.2015
sscanf
снова и снова читает одно и то же, вызывая бесконечный цикл. Он не продвигается, как вы думаете. - person Spikatrix   schedule 24.09.2015