想七想八不如11408 2023-04-03 09:51 采纳率: 50%
浏览 29

为什么这个位置1能正确输出ch,位置2就不能输出ch了

我在写洛谷题https://www.luogu.com.cn/problem/P1838
的时候遇到了问题,

#include<bitsdc++.h>
using namespace std;
const int N=110;
string x;
char g[10];
int flag;
char ch;
signed main()
{
    cin>>x;
    for(int i=0;i<x.length();i++)
    {
        if((i+1)%2!=0)    g[x[i]-'0']='x';
        if((i+1)%2==0)    g[x[i]-'0']='o';
    }
    if(g[1]==g[2]&&g[2]==g[3]) ch=g[1],flag=1;
    if(g[4]==g[5]&&g[5]==g[6]) ch=g[4],flag=1;
    if(g[7]==g[8]&&g[8]==g[9]) ch=g[7],flag=1;
    
    if(g[1]==g[4]&&g[4]==g[7]) ch=g[1],flag=1,cout<<ch<<" "<<"test0"<<endl;
    if(g[2]==g[5]&&g[5]==g[8]) ch=g[2],flag=1;
    if(g[3]==g[6]&&g[6]==g[9]) ch=g[3],flag=1;
    
    if(g[1]==g[5]&&g[5]==g[9]) ch=g[1],flag=1;
    if(g[3]==g[5]&&g[5]==g[7]) ch=g[3],flag=1;
    cout<<ch<<" "<<"test1"<<endl; 
    if(flag==1)
    {
        if(ch=='x') cout<<"xiaoa wins.";
        if(ch=='o') cout<<"uim wins.";
    }else{
        cout<<"drew.";
    }
    return 0;
}

img


为什么这个位置1能正确输出ch,位置2就不能输出ch了

img


加了goto后就能ac了,这是为什么啊。。

#include<bitsdc++.h>
using namespace std;
const int N=110;
string x;
char g[10];
int flag;
char ch;
signed main()
{
    cin>>x;
    for(int i=0;i<x.length();i++)
    {
        if((i+1)%2!=0)    g[x[i]-'0']='x';
        if((i+1)%2==0)    g[x[i]-'0']='o';
    }
    if(g[1]==g[2]&&g[2]==g[3]) 
    {
        ch=g[1],flag=1;goto end;
    }
    if(g[4]==g[5]&&g[5]==g[6]) 
    {
        ch=g[4],flag=1;goto end;
    }
    if(g[7]==g[8]&&g[8]==g[9]) 
    {
        ch=g[7],flag=1;goto end;
    }
    if(g[1]==g[4]&&g[4]==g[7]) 
    {
        ch=g[1],flag=1;goto end;
    }
    if(g[2]==g[5]&&g[5]==g[8]) 
    {
        ch=g[2],flag=1;goto end;
    }
    if(g[3]==g[6]&&g[6]==g[9]) 
    {
        ch=g[3],flag=1;goto end;
    }

    if(g[1]==g[5]&&g[5]==g[9]) 
    {
        ch=g[1],flag=1;goto end;
    }
    if(g[3]==g[5]&&g[5]==g[7]) 
    {
        ch=g[3],flag=1;goto end;
    }
    end:
    if(flag==1)
    {
        if(ch=='x') cout<<"xiaoa wins.";
        if(ch=='o') cout<<"uim wins.";
    }else{
        cout<<"drew.";
    }
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 沐阳gg 2023-04-03 09:59
    关注

    在第10行的语句 g[x[i]-'0']='x'; 中,下标 x[i]-'0' 可能会超出数组 g 的索引范围,导致未定义行为。因为 x[i] 表示的是 char 类型的字符,需要将其转换成整数类型才能计算出正确的下标。

    在第10行和第12行,应该将 g[x[i]-'0'] 修改为 g[static_cast(x[i]-'0')],以避免下标越界的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月3日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?