c++ - 以下 c++ 代码有什么问题?
问题描述
问题是 12289 - 来自在线法官在https://onlinejudge.org/external/122/12289.pdf的一二三 我必须将给定字符串 s 与以下内容进行比较:“一”、“二”、三”,并返回一个数字,该数字指示哪些在字符串的正确位置具有最正确的字符。以下是我尝试获得可接受的答案。
#include <cstdio>
using namespace std;
int main(){
char c;
int t,len,c1,c2;
scanf("%d\n",&t);
while(t--){
len = 0;
c1 = 0;
c2 = 0;
while(true){
scanf("%c",&c);
if(c=='\n') break;
if("one"[len] == c) c1++;
if("two"[len] == c) c2++;
len++;
}
if(len>3) printf("%d\n",3);
else if (c1>c2) printf("%d\n",1);
else printf("%d\n",2);
}
printf("\n");
}
我在这个问题中得到一个“错误答案”,通常不涉及格式问题。我是 C++ 新手,所以知道我可以改进什么对我有很大帮助。
解决方案
正如Thomas所说,您应该检查 len 是否 > 3。字符串基本上是由空字节或 '\0' 终止的字符数组。在内存中,这表示为 ['o', 'n', 'e', '\0', ?, ...] 其中 ? 是垃圾值,或者,正如 C/C++ 所说,非法内存访问。因此,"one"[4] == c 或 "two"[4] == c 有可能为真,因为我们不知道存储在那里的值。如果发生这种情况,那么这条线
else if (c1>c2) printf("%d\n",1);
会有问题。
推荐阅读
- javascript - 验证给定格式的字符串
- django - Django 基于唯一键的连接模型
- c++ - 不能编译归并排序树结构?
- python - Tkinter 不在窗口上打印
- javascript - Laravel-Mix 与 BrowserSync 可处理除 Vue.js 组件之外的所有内容
- php - 我的验证码不起作用。警告:imagettftext():在第 35 行的 W:\domains\shop\reg\reg_captcha.php 中找不到/打开字体
- r - 如果数据来自不同的数据集,如何将 ggplots 添加到一个中?以及如何将几何功能区添加到离散数据?
- macos - 使用 Mac 时如何导出代码?
- active-directory - 无法使用 Active Directory 凭证登录到 Amazon Linux 服务器
- kubernetes - GKE 需要 prometheus-to-sd 吗?我可以删除它吗?