簡體   English   中英

讀取每行一行,並使用fgets()和sscanf()將字符串評估為坐標

[英]Reading line per line, and evaluating strings into coordinates using fgets() and sscanf()

我正在嘗試使用fgets和sscanf讀取多行不同長度的頂點。

(1,6),(2,6),(2,9),(1,9)
(1,5)

我的程序陷入陷入第一個頂點的無限循環。

    char temp3[255];
    while(fgets(temp3, 255, fp)!= NULL){
        printf("Polygon %d: ", polycount);
        while(sscanf(temp3, "(%d,%d)", &polygonx[polycount][vertcount], &polygony[polycount][vertcount]) != EOF){
            sscanf(temp3, ",");
            printf("(%d,%d),",polygonx[polycount][vertcount], polygony[polycount][vertcount]);
            vertcount++;
        }
        vertcounts[polycount] = vertcount;
        vertcount = 0;
        polycount++;
    }

我必須能夠將頂點的x和y值輸入到多邊形數組中,所以我不得不使用sscanf。 我也有一個問題,因為我無法在互聯網上找到每行掃描不同數量元素的任何內容。

這是因為

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位置。

並且"%*[^("將跳過所有字符,直到找到下一個'('

有關"%n"說明符和%[說明符的更多信息,請參見sscanf(3)

如果成功讀取,在這種情況下sscanf將返回2 sscanf返回填充的變量數。

檢查它是否返回2 ,這將在此處指示成功。

while(sscanf(temp3,"(%d,%d)",&polygonx[polycount][vertcount],&polygony[polycount]][vertcount]) != EOF)

代替這個,檢查像這樣-

 while(sscanf(temp3,"(%d,%d)%*c",&polygonx[polycount][vertcount],&polygony[polycount]][vertcount])== 2)
                             ^ to exclude the comma after it             

也忽略坐標后的',' ,您可以使用-

sscanf(temp3, ",");

是不正確的 。 在上面的sscanf您可以使用%*c說明符讀取並丟棄它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM