【发布时间】: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