想用cin从数组下标1开始输入,在电脑上运行没问题,但是提交上去后显示编译错误

在vjudge写算法题,想用cin从数组下标1开始输入
在电脑上运行没问题,但是提交上去后显示编译错误

#include
using namespace std;
const int N = 1001000, M = 1000010;
int n, m;
char p[N], s[M];
int ne[N];
int sum = 0;
int main() {
    cin >> (p + 1) >> (s + 1);//这里+1报错,不+1不会报错
    int t = strlen(p + 1);
    int u = strlen(s + 1);
    int i, j;
    for (i = 2, j = 0; i <= t; i++) {
        while (j && p[i] != p[j + 1]) j = ne[j];
        if (p[i] == p[j + 1]) j++;
        ne[i] = j;
    }
    for (i = 1, j = 0; i <= u; i++) {
        while (j && s[i] != p[j + 1]) j = ne[j];
        if (s[i] == p[j + 1]) j++;
        if (j == t)
        {
            sum++;
            j = ne[j];
        }
    }
    printf("%d", sum);
    return 0;
}

img

参考GPT和自己的思路:

对于该问题,编译错误可能是因为在部分编译器中,使用 cin 从数组下标 1 开始输入会被认为是非法语法。为了解决这个问题,可以使用其他的输入方式,例如:

for(int i=1; i<=n; i++){
    scanf("%d", &arr[i]);
}

或者手动给数组下标 0 赋值一个非实际意义的值,使得下标从 1 开始:

int arr[N+1];
arr[0] = 0;
for(int i=1; i<=n; i++){
    cin >> arr[i];
}

还可以使用 std::ios::sync_with_stdio(false) 来解除 cincout 的同步,提高输入输出速度。最后,应该在代码中避免使用过多的全局变量。

参考GPT和自己的思路:

这个问题出现的原因是,在一些 Online Judge 上,cin 等输入输出流也用到了缓冲区,如果你的代码中有使用到数组下标,你需要保证所有的下标都在数组的有效范围内。具体地说,在 C++ 中,对于数组 p,s 的下标 i,如果你想从下标 1 开始读取,需要将表达式 p+i 替换为 p+(i-1),s+i 替换为 s+(i-1)。因此,在代码中

cin >> (p + 1) >> (s + 1);

应该改为

cin >> (p) >> (s);

如果你想从下标 2 开始读取,需要将表达式 p+i 替换为 p+(i-2),s+i 替换为 s+(i-2)。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^