在scanf语句之后,t的值变为0 无法理解为什么,t受此声明的影响,即使t = 100,程序只运行1次迭代! PS第一个问题在这里!写这个花了100分钟!总是弹出一些问题! :@
#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;
}
答案 0 :(得分:5)
调用scanf("%s%lld",d,&x)
时导致缓冲区溢出。 d
只有1 char
的空间,但%s
会读取,直到遇到空格字符。即使用户在空白之前只键入1个字符,它仍然会溢出,因为%s
在它写入的缓冲区末尾写入一个空终止符。这就是t
被修改的原因。
如果您真的只想阅读1 char
,则需要:
将d
声明为char
并使用%c
:
char d;
scanf("%c%lld",&d,&x);
将d
声明为char d[2]
,以便它有空终止符并使用%1s
:
char d[2];
scanf("%1s%lld",d,&x);
scanf("%d%d",&n,&m)
之类的事情。想想如果用户输入"123456"
并且您希望分别将其视为123
和456
,会发生什么情况。用户必须输入"123 456"
。所以请注意这一点。