【问题标题】:Runtime error in codeforces but worked just fine in Dev-C++codeforces 中的运行时错误,但在 Dev-C++ 中运行良好
【发布时间】:2020-06-03 07:55:18
【问题描述】:

我正在尝试解决一个问题,该问题需要:输入少于 150 个字符的句子,并将该句子的字符全部变为大写,同时删除所有多余的空格,然后打印更改后的句子及其字符数到屏幕。 例如:
输入:Look in to the abyss
输出:LOOK IN TO THE ABYSS:20
我在 Dev-C++ 上测试了这个程序,它工作得很好,但是当我将它提交给 CodeForces 时,我遇到了运行时错误。我希望任何人都可以帮助我。
(我尝试使用 scanf("%[^\n]%*c", sen) 和 fgets(sen, sizeof(sen), stdin) 而不是 gets(sen) 但我仍然遇到运行时错误。另外,我使用一个不同的函数 strlength 而不是 strlen,因为我在向 CodeForces 提交那段代码时遇到了另一个与类型相关的错误)
P/s:对不起我的英语不好

#include <ctype.h>
#include <stdio.h>

int strlength(char* str){
    int i,j = 0;
    for (i=0; str[i]!= '\0';i++)
        ++j;
    return j;
}
void strip_white_spaces(char* str){
    int x,i;
    for (x=i=0; str[i]!='\0';i++){
        if (!isspace(str[i])||((i>0) && (!isspace(str[i-1]))))
            str[x++] = str[i];
    }
    if (isspace(str[x-1]))
        str[x-1]='\0';
    else str[x] ='\0';
}
void touppercase(char* str){
    int i;
    for (i = 0; str[i] != '\0';i++ ){
        if (str[i] >= 'a' && str[i] <= 'z')
            str[i] -= 32;
    }
}
void main(){
 char sen[150];
 gets(sen);
 strip_white_spaces(sen);
 touppercase(sen);
 int s = strlength(sen);
 printf("%s:%d", sen, s);
}

【问题讨论】:

  • CodeForces 是否提供任何类型的指示什么是运行时错误?
  • 使用您最喜欢的调试器单步执行代码并找出崩溃的位置。请注意,C 语言中没有称为“gets”的函数——它在大约 25 年前被标记为过时,并在 9 年前被完全删除。您需要获得不会过时 30 年的新学习材料。
  • @Yonlif : CodeForces 只是指出存在运行时错误,但没有具体说明任何事情。

标签: c algorithm


【解决方案1】:

isspace(str[i-1]) 将超出i == 0 的范围,如果幸运的话,这可能会导致程序崩溃。你需要用不同的逻辑重写那个函数。

【讨论】:

  • 我编辑了那行代码并让我从 1 开始运行,但即使它在 Dev-C++ 中仍然可以正常工作,CodeForces 再次显示运行时错误。
【解决方案2】:

我发现了错误!
错误原来是在'void main()'函数。
当我用 int main() 替换它时,我在 CodeForces 中得到了完美的结果。
谢谢大家帮助我!

【讨论】:

    最近更新 更多