Това е защото това
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"
улавя броя на сканираните до момента знаци, така че можете да го използвате, за да придвижите указателя към последната сканирана позиция в изходния низ.
И "%*[^("
ще пропусне всички знаци, докато бъде намерен следващият '('
.
Моля, вижте sscanf(3)
за повече информация относно спецификатора "%n"
и спецификаторът %[
.
person
Iharob Al Asimi
schedule
24.09.2015
sscanf
чете едно и също нещо отново и отново, причинявайки безкраен цикъл. Не напредва, както си мислите. - person Spikatrix   schedule 24.09.2015