C++,其他受scanf语句影响的变量
C++, other variable getting affected by scanf statement
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("%lldn",ans);
}
return 0;
}
调用scanf("%s%lld",d,&x)
时导致缓冲区溢出。d
只能容纳1个char
,但%s
会读取,直到遇到空白字符为止。即使用户在空白之前只键入1个字符,它仍然会溢出,因为%s
会在写入的缓冲区末尾写入一个null终止符。这就是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"
。所以要注意这一点。
相关文章:
- 是否可以影响 C++ 中回调函数的局部变量?
- 为什么线程对类变量所做的更改没有影响?
- 如何影响派生类中受保护的基变量
- 我想制作受变量变化(c ++)影响的字符串
- 整数溢出是否会影响其他变量
- 为什么键入块会影响封闭范围中的变量
- 在类中添加新的成员变量会影响二进制兼容性
- 为什么C 全局变量不影响程序的内存使用情况
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- gcc优化对具有明显恒定变量的循环的影响
- 变量会影响性能吗
- C++在保存受用户输入影响的变量的状态时使用临时变量或类变量
- 如何防止char输入影响int变量
- 使函数内联是否会影响绑定到其参数的临时变量的生存期
- 如何在方法中更改受方法影响的变量/java put方法的c++替代方案
- C++,其他受scanf语句影响的变量
- 输入流失败后对输入变量的影响
- C/MATLAB API接口环境变量设置影响OS X中的其他应用程序
- 局部变量(大数组)的初始化如何影响堆栈大小
- 变量声明如何影响执行时间