sscanf用于单独的字符串(超过2个字符串)

时间:2013-06-27 21:32:00

标签: c

所以我几乎尝试了类似问题的所有解决方案,但两者都没有奏效。我有一个字符串,如下所示:

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♣HarminckarakteresnevaaaaaaaaaaINDK1010♣INDK1010♣5

2 个答案:

答案 0 :(得分:2)

您正在编写字符串缓冲区的末尾。

获得转化规范"%6[^ ]"时。 scanf()函数族将从流中读取最多6个字符(在本例中为字符串)以放入指定的缓冲区。然后它将null终止缓冲区 - 所以你的缓冲区必须至少比你提供的长度规范大一个字符。

答案 1 :(得分:0)

如果您不知道为什么会出现特定问题或者为什么实际程序不起作用,请不要将其投票。令人恼火的是你不知道问题是什么,试着回答一个完全不同的问题,并对我正试图解决的问题进行投票。感谢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?

在评论人物之前,先考虑一下downvotes和无关的答案。