首页 > 解决方案 > 不能在程序中提供更大的输入

问题描述

我正在尝试解决有关 codechef 的问题。就逻辑而言,此代码运行良好,但我无法提供大量输入。例如,如果我输入 13 位或更多位,则它不会在 vscode 中运行,如果输入为 22 位或更多位,则它不会在 devc++ 中运行。

#include <stdio.h>
#include <math.h>
#include<string.h>

int main() {
    int t, l, i, flag = 0;
    char ch = ' ';
    scanf("%d", &t);
    char d[t][100000];
    int out[t];

    for(i = 0; i < t; i++) {
        scanf("%s", &d[t]);
        size_t len = strlen(d[t]);
        printf("\n%d", len);
        char ch = d[t][0];

        for (size_t j = 0; j < len; j++) {
            if ((ch != d[t][j])) {
                flag++;
            }
        }
        if (flag >= 2 && flag != (len-1))
            out[i]=0;
        else
            out[i]=1;
        flag = 0;
    }
    for(i = 0; i < t; i++) {
        if (out[i] == 1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

试运行1:-

1
11110111111
11
Yes

试运行 2:-

1
111101111111
0

为什么它不能处理更大的输入?

标签: c

解决方案


当您从 开始编写时d[t],您超出了数组的范围,这意味着您可能正在覆盖程序的其他部分。您应该改为写入d[i].

此外,这个数组现在在堆栈上,但堆栈只有一个非常有限的大小,所以你可能会超过这个大小,这被称为堆栈溢出。在 Windows 上,堆栈大小我认为是 1MB,所以如果t大于 10,你就已经超过了。所以你应该在堆上分配。

这应该可以,但我没有测试它:

int t = 0;

scanf("%d", &t);
char **d = (char **)malloc(t * sizeof(char *));

for (int i = 0; i < t; i++){
    d[i] = (char *)malloc(STR_SIZE * sizeof(char));
    scanf("%s", d[i]);
}

推荐阅读