全RE,why??

P1319 压缩技术

spessert @ 2024-04-09 13:23:07


#include<bits/stdc++.h>
using namespace std;
int mp[2050][2050];

int main() {
    int n;
    cin >> n;
    char c;
    int i = 1, j = 1, flap = 1;

    // 读取字符直到换行符
    while ((c = getchar()) != '\n') {
        if (c == ' ') {
            continue;
        } else {
            int t = c - '0';
            while (t--) {
                if (flap % 2 == 0) {
                    mp[i][j] = 1;
                } else {
                    mp[i][j] = 0;
                }
                j++;
                if (j > n) {
                    i++;
                    j = 1;
                }
            }
            flap++;
        }
    }

    for (int ii = 1; ii <= n; ii++) {
        for (int jj = 1; jj <= n; jj++) {
            cout << mp[ii][jj]; 
        }
        cout << endl;
    }

    return 0;
}

by spessert @ 2024-04-09 13:23:33

样例都过了


by Terrible @ 2024-04-09 13:34:38

@spessert 谁告诉你数据末尾一定会有 \n 的?

事实上我们目前对于数据文件末尾是否必须以换行结尾没有强制性的规范,所以输入末尾没有 \n,也不能说什么。

通过判断 \n 来判断文件读入到末尾不都合适,你可以通过判断 getchar() 是否读取到了 EOF (stdio.h 内的宏定义,几乎都是 #define EOF -1)。

读入到文件末尾时,getchar() 会返回 EOF(洛谷环境中就是 -1),如果你用 c-‘0’c-1) 做后续的操作当然会出各种问题。

除此之外,洛谷的某些题目使用 Windows 生产出来,而且换行方式是 \r\n,也就是 \n 之前还有一个 \r(回车符),你这么写恐怕也要栽跟头。

洛谷数据中含有大量 \r

除此之外,题目没有明确输入的数字均在 0~9 之间,所以你应当使用读入整数的方式,而非字符串处理的方式读入本题数据:

int c;
while(scanf("%d",&c)!=EOF)
{
    // Your codes ...
}

by Terrible @ 2024-04-09 13:37:29

scanf 在读入到文件末尾时也会返回 EOF,其他读入 stdio.hcstdio) 提供的函数亦是如此。

如果是 cin 的方式的话,读入到末尾返回 0

int c;
while(cin>>c)
{

}

by Terrible @ 2024-04-09 13:43:35

补充:你用控制台输入的时候,输入完数据最后要打一个换行,控制台才能接受这个输入,也就是说控制台输入肯定是有换行的,但这并不适用于文件读入(例如洛谷环境判题的方式)。


by spessert @ 2024-04-09 14:12:17

@Terrible 看完醍醐灌顶,感谢大佬(●'◡'●)


|