2012-01-24 72 views
1

我在解析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

回答

0

請務必檢查返回值sscanf()。您的輸入中可能存在細微的錯誤,導致它在前幾次轉換後中止。

+0

它返回9,對於9個變量 – mustafa

2

顯然,%lld無法正常工作。根據this page,「你應該使用%I64d而不是%lld,因爲MinGW使用MSVCRT。」

希望這會有所幫助!

相關問題