2014-10-04 42 views
3

在scanf語句後,t的值變爲0 不能理解爲什麼t受此語句影響,即使t = 100,程序只運行1次迭代! PS第一個問題在這裏!花了100分鐘來寫這篇文章!總會彈出一些問題! :@C++,受到scanf語句影響的其他變量

#include<cstdio> 
#include<iostream> 
#include<vector> 
#include<algorithm> 
#include<string> 
#define MOD 1000000009 
using namespace std; 

int main() 
{ 
int t; 
scanf("%d",&t); 
while(t--) 
{ 

    int n,m; 
    scanf("%d%d",&n,&m); 
    vector< pair<long long int,char> > a(m); 
    long long int x; 
    int i; 
    char d[1]; 
    for(i=0;i<m;i++) 
    { 

      scanf("%s%lld",d,&x);// t becomes zero after this 
      a[i]=make_pair(x,d[0]); 
    } 
    sort(a.begin(),a.end()); 
    long long int ans=1; 

    for(i=0;i<m-1;i++) 
    { 

     if(a[i].second!=a[i+1].second) 
     { 
      ans=ans*(a[i+1].first-a[i].first); 
      ans=ans%MOD; 

     } 
    } 

    ans=ans%MOD; 
    printf("%lld\n",ans); 

} 
return 0; 

}

+2

+1爲您的耐心等待! – haccks 2014-10-04 19:53:45

+0

你有一個緩衝區溢出。由於這是C++,因此您應該使用流操作符而不是scanf。 – 2014-10-04 19:55:33

回答

5

要調用scanf("%s%lld",d,&x)時造成緩衝區溢出。 d只有1 char的空間,但是%s會一直讀取,直到遇到空格字符。即使用戶在空白字符前只輸入了1個字符,它仍然會溢出,因爲%s在它寫入的緩衝區的末尾寫入了一個空終止符。這就是爲什麼t被修改。

如果你真的想讀的只有1 char,你需要:

  1. 聲明d只是一個char和使用%c

    ​​
  2. 聲明d作爲char d[2]所以有一個空終止符和使用%1s

    char d[2]; 
    scanf("%1s%lld",d,&x); 
    

順便說一句,你必須要小心之類的東西scanf("%d%d",&n,&m)。想想如果用戶輸入"123456"並且您想分別將其讀作123456會發生什麼情況。用戶將不得不輸入"123 456"。所以請注意這一點。

+0

thanx很多!很好的解釋! – 2014-10-04 20:07:03