sscanf为长long int变量返回错误的数字

时间:2012-01-24 13:34:26

标签: c

我在Auction ProblemFacebook HackerCup中解析输入文件时遇到问题。

输入文件的每一行包含9个以空格分隔的整数:N,P1,W1,M,K,A,B,C和D.根据输入约束,数字可以大到10 ^ 18。所以,我决定使用long long int来存储变量。

我在做:

FILE *fr;
long long int N, P1, W1, M, K, A, B, C, D;
char line[1024];    
fr = fopen ("input.txt", "rt");

while(fgets(line, 1024, fr) != NULL)
{
    sscanf(line, "%lld %lld %lld %lld %lld %lld %lld %lld %lld", &N, &P1, &W1, &M, &K, &A, &B, &C, &D);
    printf("N:%lld P1:%lld W1:%lld M:%lld K:%lld A:%lld B:%lld C:%lld D:%lld\n\n", N, P1, W1, M, K, A, B, C, D);
}

对于行81834165 9999991 1 9999991 9999989 389999650 169999844 799999121 149999837,我得到N:81834165 P1:4367 W1:9999991 M:4078336 K:1 A:2292512 B:9999991 C:2292488 D:9999989

你能帮我指出这段代码中的问题吗?任何关于解析类似文件的建议也将受到赞赏。


编辑:我应该补充一点,它适用于int变量,如:

char line[1024];    
int N, P1, W1, M, K, A, B, C, D;

strcpy(line, "81834165 9999991 1 9999991 9999989 389999650 169999844 799999121 149999837");
printf("Line: %s", line);
sscanf(line, "%d %d %d %d %d %d %d %d %d", &N, &P1, &W1, &M, &K, &A, &B, &C, &D);
printf("ret_val:%d\n\n", ret_val);
printf("N:%d P1:%d W1:%d M:%d K:%d A:%d B:%d C:%d D:%d\n\n", N, P1, W1, M, K, A, B, C, D);

我刚注意到一些奇怪的事情。在一个long long int中打印多个printf()变量会输出错误的值,同时在单独的printf() s输出正确的值中打印它们。我的意思是:

printf("N:%lld P1:%lld\n", N, P1);
printf("N:%lld\n", N);
printf("P1:%lld\n", P1);

输出:

N:81834165 P1:2009288239
N:81834165
P1:9999991

你对此有什么想法吗?


我发现问题出在我使用的编译器上(gG在MinGW上) 在此编译器上,我需要将%lld替换为%I64d。我在this post找到了类似的问题。


2 个答案:

答案 0 :(得分:2)

显然,%lld无效。根据{{​​3}},“您应该使用%I64d代替%lld,因为MinGW使用MSVCRT。”

希望这有帮助!

答案 1 :(得分:0)

请务必检查sscanf()的返回值。输入中可能存在微小错误,导致它在前几次转换后中止。