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规范的写法,可能引发编译错误或意外问题。
逻辑冗余与代码结构问题
- 第一个
if已经将大写字母转为小写,第二个if里仍判断str[i] != 'A'、str[i] != 'E'等大写元音,这完全冗余——转小写后str[i]不可能是大写字母,这些判断可以直接删除。 - 第一个
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
相关产品推荐
相关产品推荐

