簡體   English   中英

sscanf 用於單獨的字符串(超過 2 個字符串)

[英]sscanf for separate strings (more than 2 strings)

所以我已經嘗試了幾乎所有類似問題的解決方案,但都沒有奏效。 我有一個如下所示的字符串:

AAAA BBBBBBBBBBBB CCCCCCC 15
  %s           %s      %s %d

到目前為止,我已經嘗試過:

sscanf(str, "%s %s %s %d", ...); 

第一個 %s 也吃掉了 ' ' 並沒有奏效,一切都出錯了。 之后我嘗試過:

sscanf(str, "%6[^ ] %30[^ ] %8[^ ] %d[^\n]", ...);

同樣的事情發生。 我怎樣才能用 sscanf 分割這個字符串的部分?

編輯:結果應該在一個結構中。 當前代碼如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct sor {
    char npkod[6];
    char nev[30];
    char tkod[8];
    int jegy;
} SOR;

double work(char* fnev, char* tkod)
{
    FILE * fp;
    char aktualis_sor[127] = { 0 };
    SOR beolvasott_sor;
    double atlag = 0.0;
    int ossz = 0;
    int db = 0;

    fp = fopen(fnev, "rb");
    if(fp == NULL)
    {
        printf("Fajl nem talalhato.\n");
        return -1;
    }

    while(fgets(aktualis_sor, 127, fp))
    {
        sscanf(aktualis_sor, "%6[^ ] %30[^ ] %8[^ ] %d", beolvasott_sor.npkod, beolvasott_sor.nev, beolvasott_sor.tkod, &beolvasott_sor.jegy);
        printf("%s %s %s %d\n\n\n", beolvasott_sor.npkod, beolvasott_sor.nev, beolvasott_sor.tkod, beolvasott_sor.jegy);

        if(strcmp(beolvasott_sor.tkod, tkod) == 0)
        {
            ossz += beolvasott_sor.jegy;
            ++db;
        }
    }

    fclose(fp);

    atlag = (double)ossz / (double)db;

    return atlag;
}

int main(void)
{
    printf("Atlag: %f\n", work("tan.txt", "INDK1010"));
    return 0;
}

這是實際問題: 原文:AAA111 Harminckarakteresnevaaaaaaaaaa INDK1010 5

sscanf 后的 printf:AAA111HarminckarakteresnevaaaaaaaaaaINDK1010♣ HarminckarakteresnevaaaaaaaaaaaINDK1010♣ INDK1010♣ 5

您正在寫入超過字符串緩沖區的末尾。

當給出像"%6[^ ]"這樣的轉換規范時。 scanf()系列函數將從流(或本例中的字符串)中讀取最多 6 個字符以放入指定的緩沖區。 然后它將空終止緩沖區 - 因此您的緩沖區需要至少比您提供的長度規范大一個字符。

感謝 Michael Burr,我知道唯一的問題是:

Make the char arrays large enough to store a '\0' also.

char xxx[6];

"AAA111" with %6[^ ] how would 7 bytes fit into 6 bytes?

暫無
暫無

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

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