C++,其他受scanf语句影响的变量

C++, other variable getting affected by scanf statement

本文关键字:影响 变量 语句 scanf 其他 C++      更新时间:2023-10-16

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,你需要:

  1. d声明为char并使用%c:

    char d;
    scanf("%c%lld",&d,&x);
    
  2. d声明为char d[2],这样它就有空终止符的空间,并使用%1s:

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

顺便说一句,你必须小心scanf("%d%d",&n,&m)之类的东西。想象一下,如果用户键入"123456",而您想将其分别读取为123456,会发生什么。用户将不得不键入"123 456"。所以要注意这一点。