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

Rav*_*ngh 3 c++ scanf

在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;
Run Code Online (Sandbox Code Playgroud)

}

Rem*_*eau 5

调用时导致缓冲区溢出scanf("%s%lld",d,&x). d只有1的空间char,但%s读取直到遇到空白字符.即使用户在空格之前只键入1个字符,它仍然会溢出,因为%s在它写入的缓冲区的末尾写入一个空终止符.这就是为什么要t修改.

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

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

    char d;
    scanf("%c%lld",&d,&x);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 声明d,char d[2]因此它有空终止符的空间并使用%1s:

    char d[2];
    scanf("%1s%lld",d,&x);
    
    Run Code Online (Sandbox Code Playgroud)

顺便说一下,你必须小心这样的事情scanf("%d%d",&n,&m).想想如果在用户类型会发生什么"123456",你想读它123,并456分别.用户必须改为输入"123 456".所以请注意这一点.