在自己的编译器上可以正确运行,但提交时全部RE,请问是什么情况

P1914 小书童——凯撒密码

Kelly_1 @ 2024-01-07 21:25:20

# include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    char b = getchar();
    char a[100] = "0", c;
    int i = 0;
    while ((b = getchar()) != '\n')
    {
        a[i] = c;
        i++;
    }
    int j = 0;
    for (j = 0;j < i;j++)
    {
        a[j] = a[j] + n;
    }
    for (j = 0;j < i;j++)
    {
        printf("%c", a[j]);
    }
    return 0;
}

by Dangerise @ 2024-01-07 21:43:53

  1. 建议尽早学习STL 使用string代替char[]

  2. char[]的输入可以使用scanf("%s"),不用手动输入

  3. RE一般由UB引起,所谓UB指未定义行为(Undefined Behavior),UB是编译器无法保障的行为,即有可能正确运行,也有可能崩溃,程序中应极力避免UB,常见的UB有数组下标越界。有许多UB在没有优化的情况下会正常工作,但是开启优化之后就会RE

AC代码

#include <bits/stdc++.h>

char a[100];
int main() {
    int n = 0;
    scanf("%d", &n);
    scanf("%s", a);

    int len = strlen(a);
    for (int i = 0; i < len; i++) {
        int c = a[i]; //注意这里char类型+26很可能直接越界,所以先转成int
        c += n;
        //如果超过'z',就要回到'a'
        if (c > 'z') {
            c -= 26;
        }
        a[i] = c;
    }

    printf("%s", a);
    return 0;
}

by Kelly_1 @ 2024-01-08 10:47:06

@Dangerise 谢谢。但我还是想知道我这个代码是因为什么RE,是数组下标越界还是什么?


by Dangerise @ 2024-01-08 10:52:20

@Kelly_1 抱歉不太看得出来


by Kelly_1 @ 2024-01-08 15:27:05

@Dangerise 好的,麻烦了


|