202021130162 发表于 2021-2-1 15:34:16

一个代码错误原因

本帖最后由 202021130162 于 2021-2-8 20:51 编辑

题目链接:
https://www.luogu.com.cn/problem/P2670


这是正确代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
        int a,b;
        cin>>a>>b;               //a行b列
        char m;
        int n;
        for(int i=0;i<101;i++)
                for(int j=0;j<101;j++)
                n=0;                      //初始化
        for(int i=0;i<a;i++)
                for(int j=0;j<b;j++)
                {
                        cin>>m;               //输入每行的地雷情况
                        if(m=='*')
                        {
                                n++;
                n++;
                n++;
                n++;
                n++;
                n++;
                n++;
                n++;                                //相邻的八个格子都+1   
                        }
                }
        //储存完毕,开始输出
        for(int i=0;i<a;i++)
        {
                for(int j=0;j<b;j++)
                {
                        if(m=='*')
                        cout<<"*";
                        else
                        cout<<n;
                }       
                cout<<'\n';
        }
        return 0;
}
我的问题是:
对于:
        int n;
        for(int i=0;i<101;i++)
                for(int j=0;j<101;j++)
                n=0;                      //初始化
将这一段中的101,
1.改成输入的a和b,即n,为什么得到的结果就是错误的?
2.改成100,即n,也会有测试点无法通过?

一世轻尘 发表于 2021-2-2 10:07:43

C语言不支持对数组大小进行动态定义,C99可以,改成100的话,你循环中输入了101个值,但只有100个存储空间

202021130162 发表于 2021-2-3 18:53:21

一世轻尘 发表于 2021-2-2 10:07
C语言不支持对数组大小进行动态定义,C99可以,改成100的话,你循环中输入了101个值,但只有100个存储空间

1.可是平时代码中可以这样啊:
int n;
cin>>n;
int a;
这样是可以正常运行的
2.题目范围在,将代码中所有101换成100应该也没有超出范围吧?但是题目答案还是不对?

baige 发表于 2021-2-3 21:01:13

#include <bits/stdc++.h>
using namespace std;

char grid;
int ans;
int n, m;

int main(void){
        cin >> n >> m;
        for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                        cin >> grid;
                }
        }
       
        for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                        if(grid == '*'){
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                                if(grid == '?') ans++;
                        }
                }
        }
       
        for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                        if(grid == '*') cout << "*";
                        else cout << ans;
                }
                cout << '\n';
        }
       
        return 0;
}

baige 发表于 2021-2-3 21:07:13

你的代码是错的吧,
n,m是二维数组,你这样写n[],m[],是错的

202021130162 发表于 2021-2-10 11:31:20

baige 发表于 2021-2-3 21:07
你的代码是错的吧,
n,m是二维数组,你这样写n[],m[],是错的

代码已修改,但帖子内的两个问题尚未解决,希望大牛们看看{:5_108:}

永恒的蓝色梦想 发表于 2021-2-10 12:00:39

202021130162 发表于 2021-2-3 18:53
1.可是平时代码中可以这样啊:
int n;
cin>>n;


标准根本就不允许, 这是非法的, g++ 给你开了后门而已。

202021130162 发表于 2021-2-10 18:19:30

永恒的蓝色梦想 发表于 2021-2-10 12:00
标准根本就不允许, 这是非法的, g++ 给你开了后门而已。

这样啊,就是说这种用法是错的,但是运行的时候为了体谅一下使用者还是让它跑通了?

永恒的蓝色梦想 发表于 2021-2-11 21:36:33

202021130162 发表于 2021-2-10 18:19
这样啊,就是说这种用法是错的,但是运行的时候为了体谅一下使用者还是让它跑通了?

差不多。
变长数组是 C 标准, 不是 C++ 标准, 因此有的编译器不通过。

Minecraft程序猿 发表于 2021-2-13 12:03:25

NOIP的题啊{:10_256:}@weiter
页: [1]
查看完整版本: 一个代码错误原因