You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codeforces 118A题代码提交报错,请求错误排查

代码存在的问题分析

核心错误:循环范围错误

你用sizeof(str)获取字符串长度是完全错误的。sizeof(std::string)返回的是string类对象本身的内存占用大小(通常是24或32字节,取决于编译器),而非字符串实际存储的字符数量。这会导致两种问题:

  • 若输入字符串长度小于sizeof(str),循环会越界访问string内部未使用的内存,触发未定义行为(比如程序崩溃、输出乱码);
  • 若输入字符串长度大于sizeof(str),循环会提前终止,后续字符得不到处理。
    正确做法是用str.size()或str.length()获取字符串有效长度。

头文件引用不规范

你包含的<string.h>是C语言的字符串操作头文件(对应strcpy、strlen等C函数),而C中的std::string需要引用<string>头文件。虽然部分编译器可能兼容,但这是不符合C规范的写法,可能引发编译错误或意外问题。

逻辑冗余与代码结构问题

  1. 第一个if已经将大写字母转为小写,第二个if里仍判断str[i] != 'A'、str[i] != 'E'等大写元音,这完全冗余——转小写后str[i]不可能是大写字母,这些判断可以直接删除。
  2. 第一个if后面的独立大括号是多余的,它和前面的if没有关联,虽不会直接报错,但会让代码结构混乱,容易误导逻辑理解。如果你的意图是转小写后执行后续判断,应调整结构让逻辑更清晰。

修正后的示例代码

#include<iostream>
#include<string> // 修正头文件
using namespace std;
int main()
{
    string str;
    cin >> str;
    for(int i=0; i<str.size(); i++) // 用str.size()获取正确长度
    {
        if(str[i] >= 'A' && str[i] <= 'Z')
            str[i] += 32;
        // 移除冗余的大写元音判断
        if(str[i] >= 'a' && str[i] <= 'z' && str[i] != 'a' && str[i] != 'e' && str[i] != 'i' && str[i] != 'o' && str[i] != 'u')
        {
            cout << "." << str[i];
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者muntsir89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:05:44