gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:39:54 24 4
gpt4 key购买 nike

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;

最佳答案

您在调用 scanf("%s%lld",d,&x) 时导致缓冲区溢出。 d 只能容纳 1 个 char,但 %s 会一直读取直到遇到空白字符。即使用户在空格前只输入 1 个字符,它仍然会溢出,因为 %s 在它写入的缓冲区的末尾写入了一个空终止符。这就是 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"。所以请注意这一点。

关于C++,其他变量受到 scanf 语句的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com