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

问题描述:

我在解析Auction ProblemFacebook HackerCup中的输入文件时遇到问题。sscanf为long long int变量返回错误的数字

输入文件的每行包含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); 

我只是发现了一些奇怪的。在一个printf()中打印多个long long int变量printf()在单独输出printf()时输出错误的值,输出正确的值。我的意思是:

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 

你有任何想法?


SOLUTION

我发现这个问题是与我所用的编译器(上MinGW的GCC) 在这个编译器,我需要用%I64d更换%lld。我在this post处发现了类似的问题。


+0

这对我来说很好。请发送您的整个代码。 (我只是用'#include ','int main(){'和'return 0;}来包装它''我也猜测问题在于读取文件,所以你用'int'进行的测试不能证明 – asaelr

+0

是的,它和你的完全一样,但它对我不起作用,请注意它适用于int变量 – mustafa

+0

嗯,因为相同的代码适用于我,但不适合你,所以我建议你在调试器中运行它。另外,如果你使用'strcpy'(如你的第二个代码)和'long long int'(作为你的第一个代码)会发生什么? – asaelr

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

+0

它返回9,对于9个变量 – mustafa

显然,%lld无法正常工作。根据this page,“你应该使用%I64d而不是%lld,因为MinGW使用MSVCRT。”

希望这会有所帮助!