【问题标题】:sscanf for separate strings (more than 2 strings)sscanf 用于单独的字符串(超过 2 个字符串)
【发布时间】:2013-06-27 21:32:00
【问题描述】:

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

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 Harminckarakteresnevaaaaaaaaaaa INDK1010 5

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

【问题讨论】:

  • 请参阅stackoverflow.com/questions/2091815/… 以使用strchr 代替sscanf
  • 显示更多(和可编译的)示例代码。这些sscanf() 调用在传递合理的参数以放置解析数据时对我来说很好。我怀疑您可能传递了太小的虚假指针或缓冲区。
  • @Joey Egyetemi feladat?海王星(“npkod”)? :D 最好使用strchr() 和/或strtok_r()。另外,const-限定您的输入参数。
  • 它应该确保C字符串终止字符('\0')的区域。例如。 AAA111 char npkod[7];

标签: c


【解决方案1】:

您正在写入超出字符串缓冲区的末尾。

当给定转换规范时,例如"%6[^ ]"scanf() 系列函数将从流(或本例中的字符串)中读取最多 6 个字符以放入指定的缓冲区。然后它将 null 终止缓冲区 - 因此您的缓冲区需要至少比您提供的长度规范大一个字符。

【讨论】:

    【解决方案2】:

    感谢 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?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 2010-11-07
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多